使用C#创建Windows服务应用程序。我有一个主对象创建工作线程来定期执行各种任务。每个工人完成一项特定任务,等待一段时间,然后重复。
如果其中一个任务失败,我希望该线程提醒主要人员记录任务失败然后退出。
我曾考虑使用ManualResetEvent,其中Set将从每个worker调用(并且main将循环检查它)。问题是,多个工作人员可能同时失败并尝试同时设置()事件。
是否有一种线程安全的方法来处理来自多个工作线程的警报?只需要一个警报,我不需要处理第一个警报。
答案 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或其他内容。但希望你明白这个想法