【发布时间】:2017-09-07 23:45:57
【问题描述】:
我需要使用命名事件将信号从 Windows 服务发送到 Windows 控制台/窗体应用程序。我创建了一个通用的 NamedEvents 类库,它具有创建事件的实现。
问题是我的 Windows 服务没有创建事件。如果我创建另一个 Windows 窗体应用程序(代替 Windows 服务)来创建事件,那么它可以正常工作。但是对于 Windows 服务,它似乎不起作用。如果我的代码中缺少某些内容,有人可以告诉我
public static class NamedEvents
{
public static EventWaitHandle OpenOrCreate(string name, bool initialState, EventResetMode mode)
{
EventWaitHandle ewh = null;
try
{
ewh = EventWaitHandle.OpenExisting(name);
}
catch (WaitHandleCannotBeOpenedException)
{
ewh = new EventWaitHandle(initialState, mode, name);
}
return ewh;
}
public static EventWaitHandle OpenOrWait(string name)
{
EventWaitHandle ewh = null;
while (null == ewh)
{
try
{
ewh = EventWaitHandle.OpenExisting(name);
}
catch (WaitHandleCannotBeOpenedException)
{
Thread.Sleep(50);
}
}
return ewh;
}
}
Windows 服务代码:
public void SetSignalToClient()
{
EventWaitHandle completedA = NamedEvents.OpenOrCreate("CompletedA", false, EventResetMode.ManualReset);
completedA.Set();
completedA.Close();
}
Windows 窗体应用程序:
public Form1()
{
InitializeComponent();
new Task((o) => SubscribeToAsyncEvents(),
new System.Threading.CancellationToken()).Start();
}
private void SubscribeToAsyncEvents()
{
while (true)
{
EventWaitHandle completedA = NamedEvents.OpenOrWait("CompletedA");
completedA.WaitOne();
if (textBox1.InvokeRequired)
{
textBox1.Invoke((MethodInvoker)delegate { textBox1.Text = "received"; });
}
completedA.Close();
}
}
【问题讨论】: