Dot-Net
自上一步以來程序或執行緒已更改(Visual Studio)
我有一個 C# .NET控制台應用程序,它使用 .NET 發送電子郵件
SmtpClient。我在下面顯示的程式碼中遇到以下行為:
- 在第 35 行上方的某處設置斷點
- 打斷點,單步執行第 30、32 行等。
- 在到達第 35 行之前,它又跳回到第 28 行
- 在某些時候,我收到**“自上一步以來程序或執行緒已更改”**消息
- 跳躍似乎是隨機的
為什麼我的斷點會跳來跳去?
那條消息是什麼意思?
我的程式碼有什麼問題嗎?
(這是關於 Stackoverflow 的另一個類似問題。可能是同一件事,但它是 ASP.NET)
Per Hans Passants 的提示如下。
**此版本仍然允許競爭條件:**在我的計時器事件處理程序中切換
Timer.AutoReset屬性以避免在程式碼執行時重新進入。private void OnTimerElapsed(object source, ElapsedEventArgs e) { timer.AutoReset = false; // prevent another Elapsed event MyClass.SendMail(smtpServer, account, password); // do stuff timer.AutoReset = true; // allow another Elapsed event }**最終版本:**初始化
AutoReset已經設置為 false 的計時器,然後Timer.Start()在 Elapsed 事件處理程序結束時再次呼叫。public void Start() { timer = new Timer(checkInterval); timer.Elapsed += new ElapsedEventHandler(OnTimerElapsed); timer.AutoReset = false; // prevent race condition timer.Start(); } private void OnTimerElapsed(object source, ElapsedEventArgs e) { bool exceptionIsNasty = false; try { MyClass.SendMail(smtpServer, account, password); // do stuff } catch (Exception ex) { // Log exception, set exceptionIsNasty to true if the mailing should be stopped //... } finally { if (!exceptionIsNasty) timer.Start(); // allow another Elapsed event } }
您有多個執行緒執行相同的方法並且它們都命中相同的斷點。當您繼續單步執行時,調試器無法再準確地猜測它應該顯示哪個執行緒的狀態。因此,您只會收到一條警告,表明您現在正在查看不同執行緒的狀態。局部變數值可能不同。當然,執行位置也是如此,高亮發生變化的原因。
顯然,這會使調試更加困難。如果您仍然從程式碼中得到錯誤,您想避免這種情況,只啟動一個執行緒。除此之外,臨時解決方法是使用 Debug + Windows + Threads,右鍵點擊其中一個執行緒並選擇 Freeze。不要忘記再次解凍。
