繁体   English   中英

Windows服务使用EventWaitHandle等待命名事件的问题。

[英]Issue with windows service waiting for a named event, using EventWaitHandle.

我目前正在使用c#和.net Framework 4.5开发Windows服务,以扩展现有专有应用程序的功能,该服务在EventWaitHandleClass( msdn链接 )上阻塞,等待主应用程序发出的命名事件。 像这样:

bool boolWithFalse = false;
string eName = "notification_event";
string usr = Environment.UserDomainName + "\\" + Environment.UserName;
EventWaitHandleSecurity security = new EventWaitHandleSecurity(); //*
EventWaitHandleAccessRule rule = new EventWaitHandleAccessRule(usr, EventWaitHandleRights.Synchronize, AccessControlType.Allow);
security.AddAccessRule(rule);
EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.ManualReset, eName, out boolWithFalse, security);

//... some non relevant code lines here

//This is where the it locks waiting for the named event
var w = EventWaitHandle.WaitAny(new[] { handle }, Timeout.Infinite);

*: EventWaitHandleSecurity MSDN

现在,如果我将程序作为控制台应用程序执行,这就像一个魅力,我可以轻松地从主应用程序中捕获事件并按我的意图进行处理,但是,当我将应用程序安装为服务时,它将锁定等待相同的命名事件但从未收到信号。 该服务设置为使用NT AUTHORITY \\ LOCALSERVICE帐户运行,我已经尝试使用自己的帐户(在作为控制台应用程序运行时progam使用),但没有任何反应。

如果有帮助,那么发出信号的应用程序将在我自己的帐户下运行。 感谢您的帮助,因为我是开发Windows桌面应用程序的完整入门者。

您迷上了安全帽。 两个问题。 第一个是有人必须创建事件, 其他人必须打开事件,以便两个组件共享同一个事件对象。 其中一个必须使用EventWaitHandle构造函数,另一个必须调用EventWaitHandle.OpenExisting()方法。 通常的方法是让服务创建事件并由UI程序打开事件。

下一个问题是事件对象的可见性。 Windows为命名的操作系统对象实现名称空间,与您使用C#语言使用名称空间的方式非常相似。 根名称空间由会话命名。 服务在与用户桌面程序不同的会话中运行。 若要使桌面会话程序查看在服务会话中创建的事件,您必须使用“全局”事件名称。 看起来像这样:

 string eName = "Global\\notification_event";

请注意如何命名全局可见的命名事件。 有一天,某位程序员在某个地方认为“ notification_event”是一个不错的名称选择。 你不想见他。 {guid}是个好名字,您可以从Tools + Create GUID中获得一个。 它在已知宇宙中是唯一的,甚至可能超越。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM