Принудительное завершение бесконечного потока - C#
Формулировка задачи:
Господа, подскажите пожалуйста концепцию работы с бесконечным потоком.
Поток ждет ответа от устройства. Если за некоторое время ответа не последовало, то следует завершить вообще всю работу с устройством.
В методе GetDeviceStatus происходит синхронное ожидание срабатывания устройства. То есть поток виснет наглухо, ожидая отработки метода. Сам метод изменить не представляется возможным - это функция из библиотеки, поставляемой с устройством.
Если я извне завершаю поток посредством WaitDeviceInputThread.Abort(), то он переходит в состояние AbortRequested и на этом все.
Как быть в такой ситуации?
System.Threading.Thread WaitDeviceInputThread = new System.Threading.Thread(GetDeviceStatus); WaitDeviceInputThread.Start(); if (WaitDeviceInputThread.Join(new TimeSpan(0, 0, 20))) // Прервать через двадцать секунд { WriteLogEvent("[Device] Device Thread terminated"); } else { WriteLogEvent("[Device] Device Thread Time Out And Mast Be Killed"); if (WaitDeviceInputThread.ThreadState == System.Threading.ThreadState.AbortRequested) // Если извне ожидание отменено, KillDeviceThread(); // завешить поток совсем WaitDeviceInputThread.Interrupt(); }
Решение задачи: «Принудительное завершение бесконечного потока»
textual
Листинг программы
static bool ButtonDown = false; private void Button_Click() // Нажать или не нажать решает пользователь { ButtonDown = true; } public void TryGetButtonStateAsync() // Функция изменять которую нельзя { while (!ButtonDown) // Бесконечный цикл пока не нажмется кнопка { Thread.Sleep(100); } } public async Task<string> GetButtonStateTaskAsync() { TryGetButtonState(); return "Button Down"; } public async void GetButtonStateAsync() { string res = await GetButtonStateTaskAsync(); MessageBox.Show(res); } static bool WaitButtonState = false; // Ожидам ли мы уже получение состояния public void Main() { if (WaitButtonState) // Если уже был запрос на получение состояния, то завершить его { KillWaitingTask(); // Замочить ожидающий поток WaitButtonState = false; } else { WaitButtonState = true; } GetButtonStateAsync(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д