Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计时器(线程)是否会在任务重新执行的等待期之前完成任务的执行?_C#_Multithreading_Timer - Fatal编程技术网

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。它们涉及线程池中的独立项,因此它们可能由同一物理线程处理,也可能不由同一物理线程处理。当回调方法在下次调用之前完成时,它可能由同一线程执行。不知道你的意思。当然,当回调方法仍在同一线程上执行时,不能在特定线程上再次调用它。当计时器在回调的执行过程中滴答作响时,回调只在另一个线程上执行。当回调的执行持续超过计时器间隔时,回调将在新线程上执行。你迟早会用完可用的线程。