Принудительное завершение бесконечного потока - 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();
}