我有一个 Web 服务需要等待物理设备响应来进行一些处理并将结果返回给调用者。控制物理设备的 DLL 使用 COM。
代码如下:
[WebMethod]
public DeviceResponse SendDeviceRequest(int deviceId)
{
DeviceObject device = new DeviceObject();
AutoResetEvent resetEvent= new AutoResetEvent(false);
EventHandler handler = new EventHandler (Device,resetEvent);
handler.subscribeEvent();
device.requestResponse(deviceId);
resetEvent.WaitOne(); //wait until device has fired the response event
//Do processing with device response
}
以下是 EventHandler 类:
public class EventHandler
{
DeviceObject device;
AutoResetEvent resetEvent;
public EventHandler (DeviceObject deviceObject,AutoResetEvent are)
{
device= deviceObject;
resetEvent = are;
}
public void subscribeEvent()
{
device.OnDeviceResponse += new OnDeviceResponseEventHandler(OnResponse);
}
public void OnResponse(CustomParams params)
{
//handle device response
resetEvent.Set();
}
}
我遇到的问题是该OnResponse
方法永远不会执行,并且该方法一直在等待resetEvent.Set()
. AutoResetEvents
但是,如果我使用 WindowsForms 实现 EventHandler,即使不使用对象,事件也会得到正确处理。我强烈怀疑这是由于 COM 线程和主线程之间的通信中断而发生的。
那么问题是:如何让 COM 线程和主线程通信,以便我可以监听 COM DLL 中触发的设备事件?我是否必须自己实现线程单元处理过程(以便它像在 Windows 窗体应用程序中一样工作),或者是否已经有 .NET 提供的机制来实现这一点?