AutoResetEvent в реальном времени после продолжения асинхронного ожидания в C # - PullRequest
0 голосов
/ 25 ноября 2018

Я использую C # для управления аппаратным устройством.Программа структурирована как

  1. Аппаратный управляющий поток (нормальный приоритет ЦП)

    while (notFinished)
    {
        Prepare();
        await DeviceCommunication();
        autoResetEvent.WaitOne();
    }
    
  2. Поток пользовательского интерфейса (нормальный приоритет ЦП)

  3. Большой вычислительный поток (ниже обычного приоритета ЦП)

Существует слой API устройства, написанный на C # Task.Задержка AutoResetEvent после продолжения Task иногда достигает 500 мс в зависимости от состояния ПК (тяжелый вычислительный поток даже не работает).Обычно это нормально, за исключением некоторых критических моментов управления оборудованием.Требуется время отклика 10 мс.

Я проверил настройку потока потребителя выше обычного и насмешливую асинхронную функцию, чтобы заставить ее работать синхронно.Казалось, решить проблему.Однако в реальных асинхронных функциях есть await.Они немедленно выпускают нить.Продолжения в потоках из пула потоков.


Вопрос 1

Нормальная ли задержка 500 мс?Я использую VirtualBox с i5 2 темы.Я ожидаю, что целевой ПК будет работать так же, как мой.


Предполагая, что мои выводы верны.Чтобы решить эту проблему, я могу выбрать

  1. . Используйте Task.GetAwaiter().GetResult(), чтобы включить синхронизацию для синхронизации.Это не должно вызывать взаимоблокировки.
  2. Переписать уровень API устройства для поддержки операций истинной синхронизации.Это элегантно и следует общим правилам, но их просто приятно иметь.
  3. Установить Task приоритет планирования и приоритет ЦП
  4. Использовать сторонние организации Task библиотеки

Вопрос 2

Есть лилучший выбор?


Вопрос 3
Как сделать выбор 3 (установить Task приоритет планирования и приоритет ЦП)?Кастом TaskScheduler единственный способ сделать это?

...