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

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

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

Господа, подскажите пожалуйста концепцию работы с бесконечным потоком. Поток ждет ответа от устройства. Если за некоторое время ответа не последовало, то следует завершить вообще всю работу с устройством.
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();
}
В методе GetDeviceStatus происходит синхронное ожидание срабатывания устройства. То есть поток виснет наглухо, ожидая отработки метода. Сам метод изменить не представляется возможным - это функция из библиотеки, поставляемой с устройством. Если я извне завершаю поток посредством WaitDeviceInputThread.Abort(), то он переходит в состояние AbortRequested и на этом все. Как быть в такой ситуации?

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

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();
}

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


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

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

13   голосов , оценка 4.231 из 5
Похожие ответы