Dot-Net

自上一步以來程序或執行緒已更改(Visual Studio)

  • August 5, 2021

我有一個 C# .NET控制台應用程序,它使用 .NET 發送電子郵件SmtpClient

我在下面顯示的程式碼中遇到以下行為:

  1. 在第 35 行上方的某處設置斷點
  2. 打斷點,單步執行第 30、32 行等。
  3. 在到達第 35 行之前,它又跳回到第 28 行
  4. 在某些時候,我收到**“自上一步以來程序或執行緒已更改”**消息
  5. 跳躍似乎是隨機的

自上一步螢幕截圖以來,程序或執行緒已更改

為什麼我的斷點會跳來跳去?

那條消息是什麼意思?

我的程式碼有什麼問題嗎?

這是關於 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。不要忘記再次解凍。

引用自:https://stackoverflow.com/questions/20165548