0

我有一个 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 提供的机制来实现这一点?

4

1 回答 1

0

尝试更换:

    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
于 2013-08-02T21:04:42.603 回答