【问题标题】:Do .NET Timers Run Asynchronously?.NET 计时器是否异步运行?
【发布时间】:2009-04-08 08:58:18
【问题描述】:

我的应用程序的消息传递方面使用Jabber-netXMPP library。)

如果由于某种原因与服务器的连接终止,我想做的就是每分钟左右继续尝试连接。

如果我在下一次尝试之前启动 Timer 等待一段时间,该计时器是否异步运行并且生成的 Tick 事件会加入主线程,还是我需要启动自己的线程并从内部启动计时器那里?

【问题讨论】:

    标签: c# .net multithreading timer


    【解决方案1】:

    你用的是什么类型的计时器?

    • System.Windows.Forms.Timer 将在 UI 线程中执行
    • System.Timers.Timer 在线程池线程中执行,除非您指定 SynchronizingObject
    • System.Threading.Timer 在线程池线程中执行其回调

    在所有情况下,计时器本身都是异步的 - 在触发之前它不会“占用”线程。

    【讨论】:

    • 请记住,如果您不使用 System.Windows.Forms.Timer,除非您执行适当的 InvokeRequired 检查和调用,否则访问控件将引发异常。
    • 你说得对,在我的问题中,我应该说我不确定应该使用哪个计时器。查看您提供的三个选项并阅读 MSDN,System.Timers.Timer 看起来很适合这种情况,因为在 Tick 上需要对主线程中创建的对象进行调用。
    • @Byron Ross:另一种选择是 System.Timers.Timer 将 SynchronizingObject 设置为控件。
    • 我认为主线程是应用程序在其下执行的线程,其他线程是从其创建的。这个 UI 线程的正确术语是什么?
    • 这取决于你的应用是否有 UI。 ;)。整个 UI 线程业务基于具有“主”UI(通常是某处的 Application.Run())的应用程序。同步规则是您不能访问未创建控件的线程上的 UI 控件。
    【解决方案2】:

    计时器将有效地在后台运行,并导致主线程中的事件被执行。

    【讨论】:

    • 谢谢,我以为是这样,只是需要与某人一起试听。
    【解决方案3】:

    我不确定 .NET 中的计时器是如何实现的,但如果他们使用 windows API 创建计时器,表单消息循环会收到 WM_TIMER 消息,并且只有在表单线程不忙时才能处理该请求,因此计时器将在正确的时间触发,但您可能会暂停 UI 线程。计时器将使用SetTimer API 启动,操作系统将确保发布WM_TIMER 消息。

    我查过了,只有 System.Windows.Forms.Timer+TimerNativeWindow.StartTimer(Int32) 依赖于:

    [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
    public static extern IntPtr SetTimer(HandleRef hWnd, int nIDEvent, int uElapse, IntPtr lpTimerFunc);
    

    所以只有这个计时器有描述的“问题”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 2018-11-16
      • 2015-12-02
      • 1970-01-01
      相关资源
      最近更新 更多