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

本文关键字:事件 单线程 程序 | 更新日期: 2023-09-27 18:11:09

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

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

我本以为。net平台会把这些都排队,但情况似乎并非如此。

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

事件默认是同步的。这意味着引发事件的对象只有在所有事件处理程序完成其工作后才会继续执行。事件处理程序将与引发事件的对象在同一线程上运行。由此得出以下结论:

  1. .NET框架不能排队,因为事件一个接一个地引发
  2. 你不应该在事件处理程序中做大量的计算。如果事件被快速连续触发,甚至应该避免适度的计算。
  3. 如果你想要排队,你需要自己实现它:在你的事件处理程序中,将有关新事件的信息添加到线程安全队列中,并从另一个线程处理这个队列。

我让这个问题更普遍,以消除对HPC的混淆,看起来我无法控制我的事件处理程序是如何执行的,所以我需要使它线程安全