如何使用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已经提供了一种机制来实现这一点?

如何使用COM侦听C#web服务中的物理设备事件

尝试替换:

    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