如果我设置这样的计时器:
var MyTimer = new Timer(RunTask, AutoEvent, 1000, 2000);
是否保证 RunTask 将始终在同一个线程上运行?
我所有的测试似乎都表明情况确实如此,但它是保证还是运气?
这非常重要,因为我需要存储持续调用call的变量,而我目前正在使用[ThreadStatic]属性。
我知道如果回调持有的线程长于定时器延迟,则定时器将在另一个线程上进行另一次回调;所以我把问题缩小到没有并行运行的情况(我在回调期间阻止了计时器)。
答案 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);
}
结果: