用于通知Windows应用程序的命名事件

时间:2015-04-11 03:04:22

标签: c# windows service

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

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

Windows服务代码:

public void SetSignalToClient()
{

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

wh.Set();
}

Windows窗体应用程序:

public void ReceiveSignalFromClient()
{
  textBox1.Text = "Successful";
  while (true)
   {
    EventWaitHandle wh = new EventWaitHandle(false,  EventResetMode.AutoReset, "MyEventName");
    wh.WaitOne(); 
    textBox1.Text = "Failed"; 
   }

}

提前致谢...

1 个答案:

答案 0 :(得分:1)

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

正如您可能知道的那样,Windows“事件”对象只是一个可等待的对象。信令它允许线程继续经过等待呼叫;这可用于同步算法或一个进程或线程来控制协作线程的执行状态(暂停或运行)。

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

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

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