System.Threading.Timer

8
当我们使用System.Threading.Timer时,方法是在创建定时器的线程上执行的吗?或者它在另一个线程上执行?
class Timer
{
    static void Main()
    {
        TimerCallback tcall = statusChecker.CheckStatus;
        Timer stateTimer = new Timer(tcb, autoEvent, 1000, 250);
    }
}
class StatusChecker
{
    public void CheckStatus(Object stateInfo)
    {
    }
}

我的问题是计时器委托调用的方法(CheckStatus)是在主线程中执行还是在另一个线程中执行?

你的问题表述不够明确 - 请提供一些代码以澄清你的问题。 - Daniel Mošmondor
3个回答

6

System.Threading.Timer会在线程池中的另一个线程上执行其工作。

System.Windows.Forms.Timer将在现有(GUI)线程上执行。


1
还需要注意的是 - 如果没有活动窗体(例如控制台应用程序),System.Windows.Forms.Timer 将恢复为线程池线程。当线程处于空闲状态时(没有事件处理程序执行),该方法将被执行。但是,您不会在事件处理程序中花费太多时间,对吧? :) - Vilx-
@Vilx - 我不知道这一点,所以感谢你对我的回答的补充评论 :) - Øyvind Bråthen
实际上...我撤回了。它不会还原。它只能在Windows Forms中使用。但我确信我曾经(不久前)看到过其中一个标准计时器,可以选择Windows Forms或线程池线程...但现在找不到了。 :( - Vilx-
哦,等等,我现在记起来了 - 那是BackgroundWorker! :) 对于混淆感到抱歉! - Vilx-

2

文档中指出:

回调函数所指定的方法应该是可重入的,因为它会在线程池线程上被调用。

因此,回调函数几乎肯定会在另一个线程上执行。

当然,如果您从线程池线程启动计时器,则有可能在同一线程上执行,但不能保证。


2

MSDN指出:

使用TimerCallback委托来指定您希望Timer执行的方法。计时器委托在计时器构造时指定,不能更改。该方法不会在创建计时器的线程上执行;它在系统提供的ThreadPool线程上执行。

因此,在您的示例中,计时器委托(CheckStatus)将在一个单独的线程中执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接