线程内部的Threading.Timer和Timer之间的区别
本文关键字:Timer 区别 之间 Threading 内部 线程 | 更新日期: 2023-09-27 18:16:29
之间有什么区别吗
System.Threading.Timer
System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(PerformAction), null, 0, 15000);
和
在新线程中使用System.Timers.Timer?
Thread thread = new Thread(new ThreadStart(PerformActionWithTimer));
thread.Start();
void PerformActionWithTimer()
{
//Timer inside this
}
没有System.Windows.Timer
这样的东西。大概你指的是System.Windows.Forms.Timer
。永远不要试图在多线程场景中使用该类。它在UI线程上引发Tick
事件,仅此而已。如果您希望计时器在辅助线程上引发事件,请使用System.Timers.Timer
。根本没有真正的理由直接使用System.Threading.Timer
。
我强烈建议您不要使用System.Timers.Timer
,主要是因为MSDN文档中"备注"部分提供了一些信息。
Timer组件捕获并抑制事件处理程序为Elapsed事件引发的所有异常。
这意味着,如果你的计时器的消逝事件抛出了一个你没有明确捕捉到的异常,这个异常就会被吞噬,你永远不会知道发生了什么不好的事情。
考虑以下Elapsed
事件处理程序:
static void MyTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Console.WriteLine("Badness! Throwing exception");
throw new ApplicationException("something bad happened");
}
显然,这里的意图是立即终止程序,因为它遇到了一个不可恢复的错误。但是异常永远不会转移到主程序。.NET中的计时器处理程序本质上是这样做的:
try
{
MyTimer_Elapsed(sender, args);
}
catch
{
// Why would anybody want to know that something bad happened?
}
这是一个漏洞隐藏器,因此我不会使用它。
此外,无法指定将在事件参数中提供的上下文对象,就像Windows窗体计时器(Tag
属性(或System.Threading.Timer
(传递给构造函数的state
参数(一样。
CCD_ 11是围绕CCD_。它的两个便利性(组件包装器和SynchronizingObject
(远远超过了它愚蠢的异常吞噬和缺乏用户上下文对象。不要使用它。请使用System.Threading.Timer
。
这取决于情况。System.Timers.Timer
有两种操作模式。
如果SynchronizingObject
被设置为ISynchronizeInvoke
实例,则Elapsed
事件将在托管同步对象的线程上执行。通常,这些ISynchronizeInvoke
实例正是我们都熟悉的普通老Control
和Form
实例。因此,在这种情况下,在UI线程上调用Elapsed
事件,其行为类似于System.Windows.Forms.Timer
。否则,它实际上取决于所使用的特定ISynchronizeInvoke
实例。
如果SynchronizingObject
为null,则在ThreadPool
线程上调用Elapsed
事件,其行为类似于System.Threading.Timer
。事实上,它实际上在后台使用System.Threading.Timer
,并在收到计时器回调(如果需要(后执行封送处理操作。
在您的特定情况下,您创建的System.Timers.Timer
没有分配同步对象,因此它的行为与System.Threading.Timer
相同。