从多个工作线程引发事件

本文关键字:事件 线程 工作 | 更新日期: 2023-09-27 18:06:35

使用c#创建一个windows服务应用程序。我有一个主对象,它创建工作线程来定期执行各种任务。每个工人完成一个特定的任务,等待一段时间,然后重复。

如果其中一个任务失败了,我希望该线程提醒主线程记录任务失败,然后退出。

我曾考虑过使用ManualResetEvent,其中Set将从每个worker调用(并且main将在检查它时循环)。问题是,多个工作线程可能同时失败,并同时尝试Set()事件。

是否有一种线程安全的方法来处理来自多个工作线程的警报?只需要一个警报,我只需要处理收到的第一个警报。

从多个工作线程引发事件

为什么不在Setter/Event处理程序中使用双重检查锁定?

private static readonly object Locker = new object();
private bool _closing = false;
private void YourErrorHandler(object sender, EventArgs args)
{
    if(!_closing)
       lock (Locker)
          if(!_closing)
          {
              _closing = true;
              //What ever you need to do here
          }
}

如果你需要跨进程同步,你将需要使用互斥锁或其他东西。希望你们能理解

一旦其中一个线程失败,您想要关闭整个线程,对吗?一旦发生这种情况,当您连接所有线程时,您可以检查它们的状态,并为每个失败的线程报告一个错误。比如:

while(eventNotSet) sleep();
foreach(thread)
{
  thread.Join();
  checkStatus(thread);
}