我需要使用自动重置事件和手动重置事件等命名事件将信号从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";
}
}
提前致谢...
答案 0 :(得分:1)
这个问题可能过于宽泛,具体取决于您实际希望在答案中获得的详细程度。这是一个不广泛答案......:)
正如您可能知道的那样,Windows“事件”对象只是一个可等待的对象。信令它允许线程继续经过等待呼叫;这可用于同步算法或一个进程或线程来控制协作线程的执行状态(暂停或运行)。
可以在进程之间使用命名事件,就像在同一进程中使用它们一样。唯一的区别是被命名时,两个不同的进程可以访问同一个事件对象,当然Windows(和.NET包装器)提供了一种机制来尝试创建事件,如果它已经存在则检索已经创建的事件。
通过使用事件对象可以获得的唯一“通知”是进程中的线程等待对象,然后使用超时或其他线程完成该等待(可能在另一个过程中,对于命名事件)来发信号通知事件对象。无论信令线程是在同一进程中还是在不同进程中,此通知的工作方式都相同。
如果您需要更具体的建议,那么您需要提供比目前更具体的问题。