2010-12-16 73 views
7

当我们使用System.Threading.Timer时,那么是在创建定时器的线程上执行的方法吗?或者是在另一个线程中执行?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)调用的方法?

+0

你能发布你的代码吗? – Oded 2010-12-16 09:51:32

+0

这是很模糊的你在这里问什么 - 你可以请张贴一些代码来澄清你的问题? – 2010-12-16 09:52:00

回答

6

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

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

+1

还要注意 - 如果没有活动窗体(如控制台应用程序),System.Windows.Forms.Timer将返回到线程池线程。当线程处于空闲状态时(不执行事件处理程序),该方法将被执行。但是,无论如何,你并没有花太多时间处理事件处理程序,对吧? :) – 2010-12-16 10:05:35

+0

@Vilx - 我不知道,所以谢谢你对我的回答额外的评论:) – 2010-12-16 10:25:29

+0

其实...我把它收回。它不会恢复。它只能在Windows窗体中使用。但是我确信我曾经(不久前)看到了在Windows窗体或线程池线程中选择的标准计时器之一...现在找不到它。 :( – 2010-12-16 11:21:40

2

文档说以下内容:

的回调指定的方法应该是重入的,因为它被称为在线程池线程。

所以回调几乎肯定会在另一个线程上。

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

2

MSDN国:

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

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