从多个工作线程中提升事件?

时间:2014-06-03 18:39:30

标签: c# windows multithreading service thread-safety

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

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

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

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

2 个答案:

答案 0 :(得分:0)

一旦其中一个线程失败,你想关闭整个事情,对吗?一旦发生这种情况,当您加入所有线程时,您可以检查其状态并为每个失败的个体报告错误。类似的东西:

while(eventNotSet) sleep();

foreach(thread)
{
  thread.Join();
  checkStatus(thread);
}

答案 1 :(得分:0)

为什么不在您的Setter / Event处理程序中使用Double-checked locking

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
          }
}

如果您需要跨进程同步,则需要使用Mutex或其他内容。但希望你明白这个想法