У меня есть веб-служба, которой нужно дождаться ответа физического устройства, чтобы выполнить некоторую обработку и вернуть результаты вызывающей стороне. Библиотеки 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()
. Однако, если я реализую EventHandler с помощью WindowsForms, событие обрабатывается правильно, даже без использования объекта AutoResetEvents
. Я сильно подозреваю, что это происходит из-за нарушения связи между потоками COM и основным потоком.
Тогда возникают вопросы: как я могу заставить потоки COM и основной поток взаимодействовать, чтобы я мог прослушивать событие устройства, инициированное в DLL COM? Должен ли я сам реализовывать процедуры обработки апартаментов потоков (чтобы они работали так же, как в приложении Windows Forms), или для этого уже существует механизм, предоставляемый .NET?