使用托管进程中的EventWaitHandle和非托管进程中的WaitForSingleObject进行跨进程同步

时间:2012-10-16 23:35:40

标签: c#

我有两个进程,一个使用C#创建,另一个使用本机C ++创建。

我想同步这两个进程,以便阻止非托管进程,直到托管进程启动并运行。

在托管流程中,我有以下代码:

// signal the unmanaged process that I am up and running
EventWaitHandle eventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset, "MyEventName");
eventWaitHandle.Set();

在非托管进程中,我有相应的代码来等待事件

HANDLE hWaitEvent = CreateEventW(NULL, TRUE, FALSE, "MyEventName"); 
if (hWaitEvent)
{
    // wait for managed process to signal that it is up and running
    WaitForSingleObject(hWaitEvent, 5000);
}

据我所知,在第一个过程中设置了事件。另一个进程中的WaitForSingleObject无法检测到该状态,并始终等待超时。

我错过了什么吗?感谢。

2 个答案:

答案 0 :(得分:2)

Hans Passant建议的是对的,我在C ++中打开事件时需要SYNCHRONIZE访问权。

以下是有效的代码:

在托管流程中:

    EventWaitHandle _initializedEvent = new EventWaitHandle(false, EventResetMode.ManualReset, @"Global\Initialized");

在原生过程中:

    const WCHAR* initializedEventName = L"Global\\Initialized";
    int attempt = 0;
    HANDLE eventHandle = NULL;
    while ((eventHandle = OpenEventW(SYNCHRONIZE, FALSE, initializedEventName)) == NULL && attempt < 5)
    {
       Sleep(1000);
       ++attempt;
    }

    if (eventHandle != NULL)
    {
       WaitForSingleObject(eventHandle, 5000);
       CloseHandle(eventHandle);
    }

答案 1 :(得分:1)

是的,这不起作用,您正在两端创建一个事件。其中一个必须创建它,另一个必须打开它。 C ++代码中的OpenEvent()或C#代码中的EventWaitHandle.OpenExisting()。无论什么代码首先启动都必须创建事件。