【问题标题】:System.Threading.TimerSystem.Threading.Timer
【发布时间】:2010-12-16 09:49:14
【问题描述】:

当我们使用 System.Threading.Timer 时,该方法是在创建定时器的线程上执行的吗?还是 ir 在另一个线程中执行?

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)调用的方法是在主线程中执行还是在另一个线程中执行?

【问题讨论】:

  • 你想在这里问什么有点模棱两可 - 你能发布一些代码来澄清你的问题吗?

标签: c# multithreading timer


【解决方案1】:

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

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

【讨论】:

  • 还要注意 - 如果没有活动表单(如控制台应用程序),System.Windows.Forms.Timer 将恢复为线程池线程。当线程空闲(没有事件处理程序执行)时,该方法将被执行。但是无论如何,您并没有在事件处理程序上花费太多时间,对吧? :)
  • @Vilx - 我不知道,所以感谢您对我的回答的额外评论:)
  • 其实……我收回了。它不会恢复。它仅在 Windows 窗体中可用。但我敢肯定,我曾经(不久前)看到了在 Windows 窗体或线程池线程中进行选择的标准计时器之一……不过现在找不到了。 :(
  • 哦,等等,现在我想起来了——那是BackgroundWorker! :) 很抱歉造成混乱!
【解决方案2】:

文档是这样说的:

为回调指定的方法应该是可重入的,因为它是在 ThreadPool 线程上调用的。

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

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

【讨论】:

    【解决方案3】:

    MSDN 状态:

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 2014-11-03
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      相关资源
      最近更新 更多