gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:26:47 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com