定时器.定时器vs线程.控制台应用程序上的计时器
本文关键字:定时器 程序上 计时器 应用程序 应用 vs 线程 控制台 | 更新日期: 2023-09-27 18:18:53
我注意到计时器。定时器和线程。计时器在控制台应用程序上的行为不同。看起来像在ThreadingTimer的回调,如果我抛出一个异常,它会崩溃的应用程序。然而,如果我抛出一个异常在timertimer经过的处理程序,它不会崩溃。
两个方法都在线程池中的工作线程上执行。我推测,ThreadingTimer以某种方式将异常传播到主线程,而timertimer则没有。
我在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");
}
}
正如HansPassant, mike z和Cody Gray所说,答案就在MSDN中,特别是:
有趣的是,这种行为从。net 1.1开始就存在了,所以看起来不会马上改变。Timer组件捕获并抑制由流逝事件的事件处理程序。这种行为是服从的