Принудительное завершение бесконечного потока - C#

Узнай цену своей работы

Формулировка задачи:

Господа, подскажите пожалуйста концепцию работы с бесконечным потоком. Поток ждет ответа от устройства. Если за некоторое время ответа не последовало, то следует завершить вообще всю работу с устройством.
Листинг программы
  1. System.Threading.Thread WaitDeviceInputThread = new System.Threading.Thread(GetDeviceStatus);
  2. WaitDeviceInputThread.Start();
  3. if (WaitDeviceInputThread.Join(new TimeSpan(0, 0, 20))) // Прервать через двадцать секунд
  4. {
  5. WriteLogEvent("[Device] Device Thread terminated");
  6. }
  7. else
  8. {
  9. WriteLogEvent("[Device] Device Thread Time Out And Mast Be Killed");
  10. if (WaitDeviceInputThread.ThreadState == System.Threading.ThreadState.AbortRequested) // Если извне ожидание отменено,
  11. KillDeviceThread(); // завешить поток совсем
  12. WaitDeviceInputThread.Interrupt();
  13. }
В методе GetDeviceStatus происходит синхронное ожидание срабатывания устройства. То есть поток виснет наглухо, ожидая отработки метода. Сам метод изменить не представляется возможным - это функция из библиотеки, поставляемой с устройством. Если я извне завершаю поток посредством WaitDeviceInputThread.Abort(), то он переходит в состояние AbortRequested и на этом все. Как быть в такой ситуации?

Решение задачи: «Принудительное завершение бесконечного потока»

textual
Листинг программы
  1. static bool ButtonDown = false;
  2. private void Button_Click() // Нажать или не нажать решает пользователь
  3. {
  4.     ButtonDown = true;
  5. }
  6.  
  7.  
  8. public void TryGetButtonStateAsync() // Функция изменять которую нельзя
  9. {
  10.     while (!ButtonDown) // Бесконечный цикл пока не нажмется кнопка
  11.     {
  12.         Thread.Sleep(100);
  13.     }
  14. }
  15.  
  16. public async Task<string> GetButtonStateTaskAsync()
  17. {
  18.     TryGetButtonState();
  19.     return "Button Down";
  20. }
  21.  
  22. public async void GetButtonStateAsync()
  23. {
  24.     string res = await GetButtonStateTaskAsync();
  25.     MessageBox.Show(res);
  26. }
  27.  
  28. static bool WaitButtonState = false; // Ожидам ли мы уже получение состояния
  29. public void Main()
  30. {
  31.     if (WaitButtonState) // Если уже был запрос на получение состояния, то завершить его
  32.     {
  33.         KillWaitingTask(); // Замочить ожидающий поток
  34.         WaitButtonState = false;
  35.     }
  36.     else
  37.     {
  38.         WaitButtonState = true;
  39.     }
  40.     GetButtonStateAsync();
  41. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.231 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы