.net - 自上一步以来进程或线程已更改 (Visual Studio)

标签 .net visual-studio debugging

我有一个 C# .NET 控制台应用程序,它使用 SmtpClient 发送电子邮件。

我在下面所示的代码中遇到了以下行为:

  1. 在第 35 行上方某处设置断点
  2. 到达断点,单步执行第 30、32 行等。
  3. 在到达第 35 行之前,它再次跳回到第 28 行
  4. 有时,我收到“进程或线程自上一步以来已更改”消息
  5. 跳跃似乎是随机的

The process or thread has changed since last step screen shot

为什么我的断点会跳来跳去?

该消息是什么意思?

我的代码有什么问题吗?

( Here's another similar question on 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()已过去的事件处理程序。

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
   }
}

最佳答案

您有多个线程执行相同的方法,并且它们都到达了相同的断点。当您继续单步执行时,调试器无法再准确猜测它应该显示哪个线程的状态。因此,您只会收到一条警告,表明您现在正在查看另一个线程的状态。局部变量值可能不同。当然,执行位置也是突出显示变化的原因。

显然这会使调试变得更加困难。如果您仍然从代码中发现错误,那么您想避免这种情况,请仅启动一个线程。除此之外,一种临时解决方法是使用“调试”+“Windows”+“线程”,右键单击其中一个线程并选择“卡住”。不要忘记再次解冻。

关于.net - 自上一步以来进程或线程已更改 (Visual Studio),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20165548/

相关文章:

c# - NHibernate 是否仍在为 .NET 积极开发

c# - 如何注册我的 visual studio 扩展来运行事件?

c++ - 使用 DLL 代码时堆损坏

javascript - 使用 Javascript 更改颜色 (onclick)

asp.net - 我应该使用哪个属性或方法将 ToolTip 属性绑定(bind)到 ImageField 类?

c# - Apple iCloud 访问 uwp 应用程序中的联系人

.net - 'Pinned GC handle' 背后的概念是什么?

xml - Visual Studio - 注释掉 XML 的每一行

visual-studio - Visual Studio 可以使用代码片段自动扩展文本吗?

javascript - 我的红色方 block 不会出现,因为 : "speedX and speedY aren' t defined"-console