在 .NET 进程中观看由本机进程创建的全局事件

Posted

技术标签:

【中文标题】在 .NET 进程中观看由本机进程创建的全局事件【英文标题】:Watching Global Events created by a native process in a .NET process 【发布时间】:2009-05-17 01:51:55 【问题描述】:

我在本地 C++ 进程中创建并设置/重置了一个全局事件,其创建方式如下:

HANDLE hGlobalEvent = CreateEvent(NULL, TRUE, FALSE, _T("Global\\MyEvent"));

是否有任何方法(即使它使用不是由 MS 编写的库)在 .NET (C#) 进程中注册这些事件之一,以便在全局事件更改时触发标准 .NET 事件处理程序? 而且我真的不只是想等待事件和循环,就像在 C++ 中使用 WaitForSingleObject 的方式一样......我真的希望它是一个完全异步的事件处理程序。

我不得不想象有一种简单的方法可以做到这一点......只是找不到它。

【问题讨论】:

【参考方案1】:

ThreadPool.RegisterWaitForSingleObject 可用于在事件发出信号时执行回调。使用带有字符串名称的 EventWaitHandle constructor 获取命名事件对象的 WaitHandle。

bool createdNew;
WaitHandle waitHandle = new EventWaitHandle(false,
    EventResetMode.ManualReset, @"Global\MyEvent", out createdNew);
// createdNew should be 'false' because event already exists
ThreadPool.RegisterWaitForSingleObject(waitHandle, MyCallback, null,
    -1, true);

void MyCallback(object state, bool timedOut)  /* ... */ 

【讨论】:

EventWaitHandle 将打开在 Win32 进程中创建的事件,而不是创建新事件,对吗? 是的,您可以调用构造函数的重载来验证这一点;它有一个'out' bool 参数,告诉您事件是否已经存在或由构造函数创建。在您的情况下,输出值应该为 false。我已经更新了代码 sn-p 以显示这一点。 太棒了...感谢您的更新。这真的很有帮助。现在,也许这个问题的解决方案实际上会出现在谷歌上:) 好吧……这样的作品。问题是我需要知道事件的实际状态,而这一切只是为我提供了我为 RegisterWait 中的第三个参数传入的内容。此外,如果我将最后一个参数保留为 true,它只会触发一次,我必须继续重新注册,但如果我将其设置为 false,一旦事件状态发生变化,它就会无休止地调用回调......虽然我还是不知道那个状态是什么…… 澄清一点...在 C++ 中,等待事件仅在事件状态更改为“已通知”(true)时返回,但在更改回未发送(false)时不会返回...因此,您天生就知道状态。您也可以使用 0 超时调用等待,如果它返回 WAIT_OBJECT,则状态为真,如果 WAIF_TIMEOUT,则为假。但是这个 C# 代码似乎在状态发生变化时运行回调......

以上是关于在 .NET 进程中观看由本机进程创建的全局事件的主要内容,如果未能解决你的问题,请参考以下文章

线程间的通信同步方式与进程间通信方式

.NET 程序集未使用 System.Process 创建为后台进程

创建一个不是创建进程子进程的新进程

事件驱动的进程间通信 (IPC)

linux学习之进程篇

gdb动态库延迟断点及线程/进程创建相关事件处理(下)