C# 计时器(线程)是否会在任务重新执行的等待期之前完成任务的执行?
只是想知道计时器(线程)是否会在任务重新执行的等待期之前完成任务的执行?请参见: 计时器执行的回调方法应该是可重入的,因为 它在线程池线程上调用。可以执行回调 如果计时器间隔为,则在两个线程池线程上同时执行 小于执行回调所需的时间,或者如果所有线程 池线程正在使用中,回调将排队多次C# 计时器(线程)是否会在任务重新执行的等待期之前完成任务的执行?,c#,multithreading,timer,C#,Multithreading,Timer,只是想知道计时器(线程)是否会在任务重新执行的等待期之前完成任务的执行?请参见: 计时器执行的回调方法应该是可重入的,因为 它在线程池线程上调用。可以执行回调 如果计时器间隔为,则在两个线程池线程上同时执行 小于执行回调所需的时间,或者如果所有线程 池线程正在使用中,回调将排队多次 因此,对于System.Threading.Timer,答案是否定的。正如@Clemens所说,System.Threading.Timer一直在滴答作响 如果要防止重入,可以使用监视器,或仅使用如下标志: int
因此,对于System.Threading.Timer,答案是否定的。正如@Clemens所说,
System.Threading.Timer
一直在滴答作响
如果要防止重入,可以使用监视器
,或仅使用如下标志:
int _TimerLock = 0;
void TimerTickSafe( object state )
{
if ( Interlocked.CompareExchange( ref _TimerLock, 1, 0 ) != 0 ) return;
try
{
TimerTick();
}
finally
{
Interlocked.Exchange( ref _TimerLock, 0 );
}
}
如果计时器在上一次计时仍在运行时再次计时,则新的计时将被忽略。您可以轻松地进行测试<代码>系统.窗口.窗体.计时器-是<代码>系统。线程。计时器-编号。
系统。计时器
-编号。如果我理解正确的话。。第一次回调将发生在一个线程上,第二次回调等将发生在不同的线程上?@Rushino。它们涉及线程池中的独立项,因此它们可能由同一物理线程处理,也可能不由同一物理线程处理。当回调方法在下次调用之前完成时,它可能由同一线程执行。不知道你的意思。当然,当回调方法仍在同一线程上执行时,不能在特定线程上再次调用它。当计时器在回调的执行过程中滴答作响时,回调只在另一个线程上执行。当回调的执行持续超过计时器间隔时,回调将在新线程上执行。你迟早会用完可用的线程。