c# - 创建一个跨进程的 EventWaitHandle

标签 c# events synchronization process

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

windows 服务代码

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

Windows 界面代码

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 或更高版本上运行,则需要在全局命名空间中创建事件(即,在名称前加上“Global\”前缀)。如果您使用“快速用户切换”功能,则还必须在 Windows XP 上执行此操作。

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

相关文章:

c# - 拼写检查器推荐

.net - 将 .NET EventLogEntry 实例序列化为 XML

c - 等待用户空间中可能完成?

java - 每个线程使用唯一 ID 并释放它以供重用

c# - 从 C# 调用 C dll 代码?

c# - System.Drawing.Bitmap(int32,int32) 参数在 WPF 中无效但在 win 窗体中无效

c# - .NET 中是否可以使用 C# 实现基于事件的异步模式而无需多线程?

java - 聚合中的实体可以移动到 Axon 中的另一个聚合(相同类型)吗

synchronization - 在 Quorum 中,即使导入了 block , `eth.syncing` 也会给出 False

c# - 使用传输模式证书保护 WCF