Как убедиться, что событие остановлено до возникновения ошибки - PullRequest
0 голосов
/ 01 июня 2019

Я получаю эту ошибку "Операция ввода-вывода была прервана из-за выхода из потока или запроса приложения" из кода ниже.

if (SkyQueue.IsRunning){
 _mediatimer.Tick -= UpdateSkyEvent;
 _mediatimer?.Stop();
 _mediatimer?.Dispose();
 SkyQueue.Stop();
 SkySystem.ConnectSerial = false;}

Если я добавлю секундомер, ошибки не будет ..

if (SkyQueue.IsRunning){
 _mediatimer.Tick -= UpdateSkyEvent;
 _mediatimer?.Stop();
 _mediatimer?.Dispose();
 var sw = Stopwatch.StartNew();
 while (sw.Elapsed.TotalMilliseconds < 1000)
 {
 }
 sw.Stop();
 SkyQueue.Stop();
 SkySystem.ConnectSerial = false;}

SkyQueue запускает очередь блокировки, которая запускает команды для последовательного порта и помещает результаты в ConcurrentDictionary, который UpdateSkyEvent собирает результаты. Здесь я пытаюсь все закрыть и отключиться от порта. Я предполагаю, что UpdateSkyEvent все еще работает, когда я останавливаю SkyQueue, поэтому я получаю сообщение об ошибке. Секундомер, кажется, дает порту достаточно времени, чтобы ответить на последнее событие и, наконец, останавливается. Добавление секундомера кажется хаком. Есть ли лучший способ узнать, действительно ли последнее событие закончено?

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