物理デバイスの応答を待って何らかの処理を行い、結果を呼び出し元に返す必要がある 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 によって既に提供されていますか?