如何在interop dll异步后订阅set事件

时间:2015-02-24 05:23:10

标签: c# event-handling interop dllimport

我想订阅来自hEvent的活动,但仍然不明白如何从IntPtr订阅。我在网上搜索,找到使用代表的方式。如何订阅此类财产的事件?

我的C#代码:

var hEvent = new IntPtr();
IntPtr lpcOmcr = OMCR_OpenDevice(null, ref lpcOption);
uint result = OMCR_TurnonLED(lpcOmcr, (int)ReturnCode.LedColor.OMCR_SET_LED_COLOR_GREEN, ref hEvent); //result = 1 == OMCR_STATUS_PENDING

API文档: enter image description here

有没有人经历过这个?谢谢。 注意:此代码可用于打开LED。

1 个答案:

答案 0 :(得分:0)

这种情况下的“事件”与C#事件不同。这是一个非托管的Windows事件句柄。你所能做的就是等待它。幸运的是,.NET确实提供了一些有用的包装器来让你使用它。

你要处理的基本方法是:

var hEvent = new IntPtr();
IntPtr lpcOmcr = OMCR_OpenDevice(null, ref lpcOption);
uint result = OMCR_TurnonLED(lpcOmcr, (int)ReturnCode.LedColor.OMCR_SET_LED_COLOR_GREEN, ref hEvent); //result = 1 == OMCR_STATUS_PENDING

using (EventWaitHandle waitEvent =
    new EventWaitHandle(false, EventResetMode.ManualReset))
{
    waitEvent.SafeWaitHandle = new SafeWaitHandle(hEvent, false);
    waitEvent.WaitOne();
}

至少,这应该有效。如果没有完整的代码示例,我无法测试上述内容以确保它适用于您的情况。

请注意,上述内容是严格同步的,当然根本不涉及C#事件。但是,您当然可以采用上述基本技术并将其包装在所需的C#抽象中。