我有一个使用SmtpClient
发送电子邮件的C# .NET 控制台应用程序。
我在下面的代码中遇到了以下行为:
- 在第35行以上设置断点
- 命中断点后,逐行执行第30行、32行等
- 在它到达第35行之前,它跳回到第28行
- 在某个时刻,我会收到“进程或线程自上次步骤以来已更改”的消息
- 跳来跳去似乎是随机的
为什么我的断点会跳来跳去?
那个消息是什么意思?
我的代码有什么问题吗?
(这里是Stackoverflow上另一个类似的问题。可能是相同的问题,但是它是ASP.NET)
根据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,然后在Elapsed事件处理程序的结尾再次调用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
}
}
static
的,但我猜想即使它不是static
的,每次我想发送电子邮件时都必须创建一个新的对象实例,同样的事情也会发生。此外,我猜想为什么我有多个线程执行相同的代码是因为每隔1秒就会触发一个事件,每次我慢慢按F10键,该方法都会被该事件再次调用,我的猜想正确吗? - JohnBTimer.Enabled
? - JohnB