Завершение события не сработает при вызове в асинхронном контроллере MVC - PullRequest
0 голосов
/ 20 октября 2011

Я использую оболочку для библиотеки WCL BT. Поскольку приложение находится в .NET 4, а лицензия на упаковщик - в .NET 2, это небрежный обходной путь.

Использование этой оболочки с приложением .NET 4 WPF работает нормально, если включен useLegacyV2RuntimeActivationPolicy. Подробнее об этом здесь . На запуск события OnDiscoveryComplete уходит около 22 секунд.

Но при использовании той же оболочки с приложением ASP NET MVC 3 событие OnDiscoveryComplete в библиотеке никогда не вызывается. Кто-нибудь знает почему?

Оболочка вызывается для buttonClickedEvent в приложении WPF и для действия SearchAsync в AsyncController в приложении MVC.

Соответствующий код здесь:

Вызов оболочки:

var wrapper = new Wrapper();
wrapper.Search();

Wrapper:

public Wrapper() {
    _wclApi = new wclAPI();
    _wclApi.Load();
     _btDiscovery = new wclBluetoothDiscovery();
    _btDiscovery.OnDiscoveryStarted += BtDiscoveryOnDiscoveryStarted;
    _btDiscovery.OnDiscoveryComplete += BtDiscoveryOnDiscoveryComplete;
}

public void Search() {
    var radios = new wclBluetoothRadios();
    var ret = _btDiscovery.EnumRadios(radios);

    if (ret == 0) {
        wclBluetoothRadio radio = radios[0];
        _btDiscovery.Discovery(radio, 0x15);
    }
}

private void BtDiscoveryOnDiscoveryComplete(object sender, wclBluetoothDiscoveryCompleteEventArgs e) {
    // handle devices found
}

1 Ответ

0 голосов
/ 20 октября 2011

Вероятно, есть исключение, что wclBluetoothDiscovery сталкивается, но не подвергается должному воздействию. Это распространенная ошибка в асинхронных API-интерфейсах, которая не информирует вызывающих абонентов, когда происходят плохие вещи ... правильная конструкция API будет состоять в том, чтобы вызывать событие * Complete, но затем вызывать исключение при запросе завершенных аргументов события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...