我有一个 C# .NET 控制台应用程序,它使用 SmtpClient
发送电子邮件。
我在下面所示的代码中遇到了以下行为:
- 在第 35 行上方某处设置断点
- 到达断点,单步执行第 30、32 行等。
- 在到达第 35 行之前,它再次跳回到第 28 行
- 有时,我收到“进程或线程自上一步以来已更改”消息
- 跳跃似乎是随机的
为什么我的断点会跳来跳去?
该消息是什么意思?
我的代码有什么问题吗?
( 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/