如何使用COM侦听C#web服务中的物理设备事件
本文关键字:物理设备 事件 服务 C#web 何使用 COM 侦听 | 更新日期: 2023-09-27 18:25:56
我有一个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()
。但是,如果我使用WindowsForms实现EventHandler,即使不使用AutoResetEvents
对象,事件也会得到正确处理。我强烈怀疑这是由于COM线程和主线程之间的通信中断造成的。
那么问题来了:我如何让COM线程和主线程通信,这样我就可以监听COM DLL中触发的设备事件?我是否必须自己实现线程单元处理过程(以便它像在Windows窗体应用程序中那样工作),或者.NET已经提供了一种机制来实现这一点?
尝试替换:
handler.subscribeEvent();
device.requestResponse(deviceId);
resetEvent.WaitOne();//wait until device has fired the response event
//Do processing with device response
带有:
handler.subscribeEvent();
var thread = new Thread(() =>
{
device.requestResponse(deviceId);
});
thread.Start();
resetEvent.WaitOne();//wait until device has fired the response event
//Do processing with device response