我有两个Windows应用程序,一个是创建EventWaitHandle并等待它的Windows服务。第二个应用程序是Windows gui,可通过调用EventWaitHandle.OpenExisting()来打开它并尝试设置事件。但是我在OpenExisting中遇到了一个异常(exception)。异常(exception)是“拒绝访问路径”。

Windows服务代码

EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.AutoReset, "MyEventName");
wh.WaitOne();

Windows GUI代码
try
{
    EventWaitHandle wh = EventWaitHandle.OpenExisting("MyEventName");
    wh.Set();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

我在两个示例控制台应用程序中尝试了相同的代码,效果很好。

最佳答案

您需要使用带有EventWaitHandle constructor实例的EventWaitHandleSecurity版本。例如,以下代码应该可以工作(未经测试,但希望可以帮助您入门):

// create a rule that allows anybody in the "Users" group to synchronise with us
var users = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);
var rule = new EventWaitHandleAccessRule(users, EventWaitHandleRights.Synchronize | EventWaitHandleRights.Modify,
                          AccessControlType.Allow);
var security = new EventWaitHandleSecurity();
security.AddAccessRule(rule);

bool created;
var wh = new EventWaitHandle(false, EventResetMode.AutoReset, "MyEventName", out created, security);
...

另外,如果您在Vista或更高版本上运行,则需要在全局 namespace 中创建事件(即,在名称前加上“Global\”作为前缀)。如果您使用“快速用户切换”功能,则还必须在Windows XP上执行此操作。

关于c# - 创建一个跨进程EventWaitHandle,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2590334/

10-13 04:02