单线程程序的C#事件订阅限制

时间:2011-10-11 13:19:58

标签: c# hpc

我正在尝试监控在单线程程序中并行运行的许多HPC作业的状态,我正在订阅OnJobState引发的事件,并且当监视少至三个作业时,事件状态更改将丢失并且作业卡住了。

我假设我需要一个每个作业的线程来捕获所有事件,但我找不到任何有关单个线程程序中事件下限的信息。

我原本以为.net平台会将这一切排好,但情况似乎并非如此。

2 个答案:

答案 0 :(得分:0)

默认情况下,事件是同步的。这意味着引发事件的对象将在所有事件处理程序完成其工作后继续执行。事件处理程序将在与引发事件的对象相同的线程上运行。这导致了以下结论:

  1. .NET框架无法对任何内容进行排队,因为事件是一个接一个地引发的
  2. 您不应该在事件处理程序中进行繁重的计算。如果事件是连续快速发生的,那么应该避免适度的计算。
  3. 如果您想要排队,您需要自己实现:在您的事件处理程序中,将有关新事件的信息添加到a thread safe queue并从另一个线程处理此队列。

答案 1 :(得分:0)

我使this question更加通用,以消除对HPC的混淆,看起来我无法控制我的事件处理程序的执行方式,因此我需要使其线程安全。