Я использую C # для управления аппаратным устройством.Программа структурирована как
Аппаратный управляющий поток (нормальный приоритет ЦП)
while (notFinished)
{
Prepare();
await DeviceCommunication();
autoResetEvent.WaitOne();
}
Поток пользовательского интерфейса (нормальный приоритет ЦП)
- Большой вычислительный поток (ниже обычного приоритета ЦП)
Существует слой API устройства, написанный на C # Task
.Задержка AutoResetEvent
после продолжения Task
иногда достигает 500 мс в зависимости от состояния ПК (тяжелый вычислительный поток даже не работает).Обычно это нормально, за исключением некоторых критических моментов управления оборудованием.Требуется время отклика 10 мс.
Я проверил настройку потока потребителя выше обычного и насмешливую асинхронную функцию, чтобы заставить ее работать синхронно.Казалось, решить проблему.Однако в реальных асинхронных функциях есть await
.Они немедленно выпускают нить.Продолжения в потоках из пула потоков.
Вопрос 1
Нормальная ли задержка 500 мс?Я использую VirtualBox с i5 2 темы.Я ожидаю, что целевой ПК будет работать так же, как мой.
Предполагая, что мои выводы верны.Чтобы решить эту проблему, я могу выбрать
- . Используйте
Task.GetAwaiter().GetResult()
, чтобы включить синхронизацию для синхронизации.Это не должно вызывать взаимоблокировки. - Переписать уровень API устройства для поддержки операций истинной синхронизации.Это элегантно и следует общим правилам, но их просто приятно иметь.
- Установить
Task
приоритет планирования и приоритет ЦП - Использовать сторонние организации
Task
библиотеки
Вопрос 2
Есть лилучший выбор?
Вопрос 3
Как сделать выбор 3 (установить Task
приоритет планирования и приоритет ЦП)?Кастом TaskScheduler
единственный способ сделать это?