关于 c#:Named Events 通知 Windows 应用程序

 2022-01-08 

Named Events to notify Windows Application

我需要使用自动重置事件和手动重置事件等命名事件将信号从 Windows 服务发送到 Windows 控制台/窗体应用程序。我了解 AutoResetEvents 和 ManualResetEvents 主要用于线程同步,但现在我需要使用命名事件来向 Windows 窗体应用程序发出信号。我 EventWaitHandler 并编写了可以执行此操作的代码,因为我的 Windows 服务在 SetSignalToClient 方法调用时崩溃了

在事件查看器中,我发现异常为:
异常信息:System.Threading.WaitHandleCannotBeOpenedException

Windows 服务代码:

1
2
3
4
5
6
7
public void SetSignalToClient()
{

 System.Threading.EventWaitHandle wh =  EventWaitHandle.OpenExisting("MyEventName", EventWaitHandleRights.Modify);

wh.Set();
}

Windows 窗体应用程序:

1
2
3
4
5
6
7
8
9
10
11
public void ReceiveSignalFromClient()
{
  textBox1.Text ="Successful";
  while (true)
   {
    EventWaitHandle wh = new EventWaitHandle(false,  EventResetMode.AutoReset,"MyEventName");
    wh.WaitOne();
    textBox1.Text ="Failed";
   }

}

提前谢谢...


这个问题可能过于宽泛,具体取决于您实际希望在答案中获得的详细程度。这是一个不广泛的答案...... :)

您可能知道,Windows"事件"对象只是一个可等待对象。发信号通知它允许线程继续等待调用;这可用于同步算法或用于一个进程或线程来控制协作线程的执行状态(暂停或运行)。

人们会在进程之间使用命名事件,就像在同一进程中使用它们一样。唯一的区别是命名后,两个不同的进程可以访问同一个事件对象,当然 Windows(和 .NET package器)提供了一种尝试创建事件的机制,如果它已经存在,则检索已经创建的事件。

可以通过使用事件对象获得的唯一"通知"是进程中的线程等待对象,然后等待通过超时或其他线程(可能在另一个进程中,对于命名事件)向事件对象发出信号。无论信号线程是在同一个进程中还是在不同的进程中,此通知的工作方式都是相同的。

如果您需要比这更具体的建议,您需要提供比目前更具体的问题。