Принудительное завершение бесконечного потока - 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();
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д