C#计时器回调

时间:2017-08-23 14:48:46

标签: c# .net timer

如果我设置这样的计时器:

var MyTimer = new Timer(RunTask, AutoEvent, 1000, 2000);

是否保证 RunTask 将始终在同一个线程上运行?

我所有的测试似乎都表明情况确实如此,但它是保证还是运气?

这非常重要,因为我需要存储持续调用call的变量,而我目前正在使用[ThreadStatic]属性。

我知道如果回调持有的线程长于定时器延迟,则定时器将在另一个线程上进行另一次回调;所以我把问题缩小到没有并行运行的情况(我在回调期间阻止了计时器)。

2 个答案:

答案 0 :(得分:5)

System.Threading.TimerCallback委托允许您将上下文对象传递给回调方法。您可以使用此上下文对象在回调处理程序中传递所需的状态。这样,无论你回调什么线程都没关系,因为你不需要使用ThreadStatic。

传递给state构造函数的Timer参数将传递给回调方法。

答案 1 :(得分:0)

为了回答你的问题,不存在TimerCallback的“保留”线程。该事件是在ThreadPool上安排的,并且无法保证下一个tick会在同一个线程上发生,即使它是可能的。

一个简单的测试说明了这一点:

myTimer = new System.Threading.Timer(timer_Elapsed, null, 0, Timeout.Infinite);

static void timer_Elapsed(object state)
{
    Thread.Sleep(100);
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
    myTimer.Change(100, Timeout.Infinite);
}

结果:

enter image description here