【问题标题】:Raise event from multiple worker threads?从多个工作线程引发事件?
【发布时间】:2023-03-04 20:32:01
【问题描述】:

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

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

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

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

【问题讨论】:

标签: c# windows multithreading service thread-safety


【解决方案1】:

为什么不在您的 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 或其他东西。但希望你能明白

【讨论】:

  • 接受这个答案,因为它似乎是最正确的。我对this article 有点困惑,它详细解释了人们如何不能使用线程事件并确保安全......但只要我从不退订,我想我永远不会有问题担心关于。也就是说,我也刚刚发现我有一个 Linux 机器可以在上面运行这个应用程序,所以我认为我将不得不将语言切换到 C++ 或者学习 python(最初的开发人员开始使用但没有不要走得太远)。谢谢!
  • 考虑过在一个 linux 机器上使用 mono,但我需要支持记录到 eventlog(现在是 syslog)以及链接到 winpcap 或 libpcap。在这一点上,我不确定该走哪条路。哈哈
【解决方案2】:

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

while(eventNotSet) sleep();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多