我注意到Timers.Timer和Threading.Timer在控制台应用程序上的行为有所不同。看起来像ThreadingTimer的回调,如果我抛出一个异常,它会崩溃应用程序。但是,如果我在TimersTimer经过的处理程序中抛出异常,它将不会崩溃它。
这两个方法都是在线程池的工作线程上执行的。我推测ThreadingTimer以某种方式将异常传播到主线程而TimersTimer不会。
我在MSDN中找不到这种行为的解释,你能帮我解决这个问题吗?
以下是行为示例:
class Program
{
static void Main(string[] args)
{
var healthMonitor = new HealthMonitor();
healthMonitor.Start();
Console.ReadLine();
}
}
internal class HealthMonitor
{
private Timer _timersTimer;
private System.Threading.Timer _threadingTimer;
public void Start()
{
StartTimersTimer();
// StartThreadingTimer();
}
private void StartThreadingTimer()
{
_threadingTimer = new System.Threading.Timer(
ThreadingTimerCallback,
null,
TimeSpan.FromMilliseconds(5000),
TimeSpan.FromMilliseconds(5000));
}
private void ThreadingTimerCallback(object state)
{
Console.WriteLine("Throwing from ThreadingTimer..");
throw new Exception("Exception from ThreadingTimer");
}
private void StartTimersTimer()
{
Console.WriteLine("Starting timers...");
_timersTimer = new Timer(5000);
_timersTimer.Elapsed += TimersTimer_Elapsed;
_timersTimer.Enabled = true;
}
private void TimersTimer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Throwing from TimersTimer...");
throw new Exception("Exception from TimersTimer");
}
}
答案 0 :(得分:0)
正如HansPassant,mike z和Cody Gray所说,答案是在MSDN中,特别是:
Timer组件捕获并抑制所引发的所有异常 Elapsed事件的事件处理程序。此行为受制于 在.NET Framework的未来版本中进行更改。
有趣的是,自.Net 1.1以来,这种行为就出现了,所以看起来变化并不迫在眉睫。