Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从互操作dll订阅异步后的set事件_C#_Event Handling_Interop_Dllimport - Fatal编程技术网

C# 如何从互操作dll订阅异步后的set事件

C# 如何从互操作dll订阅异步后的set事件,c#,event-handling,interop,dllimport,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

我想从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文档:

有人经历过吗?非常感谢。
注意:此代码用于打开LED。

这种情况下的事件与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抽象中。

在本例中,我一直等到设置waitEvent.set和in-waitEvent.SafeWaitHandle=new-safewaithandleEvent,false;我只是将现有句柄设置为等待,如何从那里获取信号?在c上,只需订阅+=我发现从web上获得有关此的参考非常困难:@PeterDuniho@yovierayz如我所说,这里的事件与C的事件无关。对于这个问题,您应该完全忘记关于C事件的所有知识,包括+=订阅语法。这完全不适用于这种情况。上面我所显示的是响应/响应库返回的事件句柄所需的最小值。如图所示,您通过呼叫WaitOne获得信号。可以将事件句柄封装在C事件中,但是您真的需要吗?您希望等待事件句柄发出信号多长时间?哦,好的,我明白了。我需要在从事件获取信号后运行方法。在打开led的方法上,我不需要它,但对于其他方法。例如,在插入时检测卡。在OMCR_MonitorCardStatus方法上,也有类似的事件@彼得Duniho@yovierayz当前位置如果没有更多的细节,我无法确切地说你应该做什么。但有一种可能是指定一个线程来等待该事件句柄,或者如果您还有其他事件,则指定一个事件处理程序数组。见例。请注意,您可以创建自己的EventWaitHandle,以便在需要更改其等待的句柄时向此类线程发送信号。