如果我设置这样的计时器:
var MyTimer = new Timer(RunTask, AutoEvent, 1000, 2000);
Run Code Online (Sandbox Code Playgroud)
是否保证RunTask将始终在同一个线程上运行?
我所有的测试似乎都表明情况确实如此,但它是保证还是运气?
这非常重要,因为我需要存储持久调用调用的变量,而我现在正在使用[ThreadStatic]属性.
我知道如果回调持有的线程长于定时器延迟,则定时器将在另一个线程上进行另一次回调; 所以我把问题缩小到没有并行运行的情况(我在回调期间阻止了teh定时器).
要回答您的问题,不存在 TimerCallback 的“保留”线程之类的东西。该事件被安排在线程池上,并且不能保证下一个时钟周期将在同一线程上发生,即使有可能。
一个简单的测试说明了这一点:
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);
}
Run Code Online (Sandbox Code Playgroud)
结果:
该System.Threading.TimerCallback委托允许上下文对象传递给回调方法.您可以使用此上下文对象在回调处理程序中传递所需的状态.这样,无论你回调什么线程都没关系,因为你不需要使用ThreadStatic.
state传递给Timer构造函数的参数将传递给回调方法.
| 归档时间: |
|
| 查看次数: |
7427 次 |
| 最近记录: |