Nano Hash - криптовалюты, майнинг, программирование

Как прослушивать событие физического устройства в веб-службе С# с помощью COM

У меня есть веб-служба, которой нужно дождаться ответа физического устройства, чтобы выполнить некоторую обработку и вернуть результаты вызывающей стороне. Библиотеки 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?


  • Первый и самый очевидный вопрос, который приходит мне на ум: вы уверены, что метод requestResponse устройства на самом деле асинхронный? 03.08.2013
  • Что делает device.requestResponse(deviceId), и вы уверены, что это вызывает OnDeviceResponse? 03.08.2013
  • @Alden device.requestResponse(deviceId) отправляет запрос на устройство с заданным идентификатором для выполнения операции. После этого управление передается устройству. Устройство запускает событие OnDeviceResponse после завершения обработки запроса, выданного методом device.requestResponse(deviceId). 03.08.2013
  • @DavidH, метод requestResponse выполняется синхронно, но я не уверен, как обрабатывать асинхронное событие с устройства или почему одна и та же реализация работает в приложении формы Windows. Мы будем очень признательны за любые рекомендации. 03.08.2013

Ответы:


1

Попробуйте заменить:

    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
02.08.2013
  • После замены результат тот же. Каким-то образом EventHandler не входит в метод OnResponse, когда устройство запускает событие. 03.08.2013
  • Логически можно только предположить, что устройство никогда не вызывает событие. Как странно. 03.08.2013
  • Поскольку я знаю, что это работает, если я реализую его с помощью приложения Windows Forms, и единственная разница с моим кодом заключается в том, что я не использую атрибут STAThread, я думаю, это может быть причиной. Причина, по которой я не использовал это раньше, заключалась в том, что мне сказали, что библиотеки DLL для устройства не используют COM, но я считаю, что они это делают. Я подтвержу это завтра и дам вам знать, что происходит. 04.08.2013
  • Я проверил упомянутое изменение, и оно не сработало. После дальнейшего чтения проблема, похоже, возникла из-за связи с DLL-библиотеками COM, которые управляют физическим устройством. Я отредактирую OP, чтобы отразить это. 05.08.2013
  • Наконец-то мне удалось поговорить с поставщиком библиотек, запускающих события, и выяснилось, что они не добавили поддержку многопоточных апартаментов в COM-библиотеки, которые я использую. Подписка на события, подобные предложенным @DavidHaney, работает при использовании одного потока. 09.03.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..