【问题标题】:Named Events to notify Windows Application通知 Windows 应用程序的命名事件
【发布时间】:2015-04-11 03:04:22
【问题描述】:

我需要使用自动重置事件和手动重置事件等命名事件将信号从 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"; 
   }

}

提前谢谢...

【问题讨论】:

    标签: c# windows service


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我在进程之间使用命名事件,为此我创建了一个在其中定义事件的类库。在我的 Windows 服务和我的 Windows 窗体应用程序中使用这个类库作为参考。 WindowsForm 应用程序中的代码将在 WaitOne() 处等待,我的 Windows 服务将引发 Set 事件。我不知道我是否遗漏了什么,但我的 Windows 服务正在触发手动 ResetEvent 上的 Set 事件,但我的 Windows 应用程序没有收到它....
    • @marak:您遗漏了一些东西,但缺少可靠地重现问题的a good, minimal, complete code example,无法说是什么。请注意,如果您编辑您的问题以包含此类代码示例,以及有关您遇到的问题的任何具体详细信息,则该问题可能不再被视为“过于宽泛”并且能够重新开放。如果您确实编辑了问题,如果您希望我参与重新开放的投票,请务必在此处添加评论(否则我不会知道它发生了)。
    猜你喜欢
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    相关资源
    最近更新 更多