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()。ただし、WindowsForms を使用して EventHandler を実装すると、オブジェクトを使用しなくても、イベントは正しく処理されAutoResetEventsます。これは、COM スレッドとメイン スレッド間の通信の中断が原因で発生したと強く考えられます。

問題は次のとおりです。COM DLL でトリガーされたデバイス イベントをリッスンできるように、COM スレッドとメイン スレッドを通信させるにはどうすればよいでしょうか。スレッド アパートメント処理手順を自分で実装する必要がありますか (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 に答える