【问题标题】:System.Timers.Timer event handlers threading modeSystem.Timers.Timer 事件处理程序线程模式
【发布时间】:2010-04-13 12:28:41
【问题描述】:

在 MSND 中找不到我的问题的答案:
Timer 类是否保证订阅 Elapsed 事件的所有处理程序都将在同一个线程池线程上执行?如果是,是否会按照添加到 Elapsed 事件的顺序执行?

【问题讨论】:

    标签: .net-3.5 timer


    【解决方案1】:

    据我所知,确保 Elapsed 事件处理程序都在同一个线程上的唯一方法是设置 Timer 的 SynchronizingObject 属性(通常设置为控件或表单上的某些东西,以便Elapsed 事件在 UI 线程上处理)。否则,事件将在线程池线程上处理,这意味着它可能每次都是同一个线程,但几乎肯定不会。

    见:http://msdn.microsoft.com/en-us/library/system.timers.timer.elapsed.aspx

    事件处理程序触发的顺序可能将按照您添加它们的顺序,但这不能保证,并且将来可能会改变。如果您的设计依赖于按特定顺序触发的事件,您应该更改您的设计。

    【讨论】:

    • 我想我在这里找到了答案:msdn.microsoft.com/en-us/library/awbftdfh.aspx •当一个事件有多个订阅者时,事件处理程序会在一个事件引发时同步调用。表示handlers在SINGLE线程池线程上一个接一个地执行。
    • @user315454:是的,这意味着每次引发事件时,都会在同一个线程上一个接一个地调用所有订阅处理程序。但是,下次引发该事件时,几乎可以肯定它与上一次在不同的线程上。在这一点上,这可能主要是语义上的,但是 Timer 类不保证所有处理程序都将在同一个线程上调用,因为这个线程可以并且将会从一个事件变为另一个事件。
    • 但是,我认为您根本不在乎这些。 :) 您似乎找到了具体问题的答案。
    • 你说得对,我的具体问题是“要知道所有处理程序都已完成处理”PER“TRANSACTION”(引发事件)。下一个问题是让“选择的线程返回池”事件:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多