Как остановить поток, когда мое приложение winform закрывается

У меня есть singleton, у которого есть работающий поток для получения записей с сервера. Но когда я останавливаю свое приложение winform, поток продолжает работать. Я попытался создать деструктор в моем синглете, чтобы прервать поток, если он работает, но он не влияет на поток - я знаю, что деструктор вызван.

Я ищу предложения о том, как я должен закрывать поток, когда мое приложение закрывается. спасибо

С#,.net2

Ответ 1

Лучший вариант, если это возможно в вашем приложении, - это аннулирование сотрудничества.

Поток автоматически останавливается, когда у него больше нет кода для выполнения. Таким образом, когда пользователь закрывает ваше приложение, вы устанавливаете флаг, указывающий, что ваш поток должен остановиться. Поток должен проверять время от времени, если флаг установлен и, если это так, прекратить получение записей с сервера и вернуться.

В противном случае вы можете перевернуть свое собственное решение, например

static bool isCancellationRequested = false;
static object gate = new object();

// request cancellation
lock (gate)
{
    isCancellationRequested = true;
}

// thread
for (int i = 0; i < 100000; i++)
{
    // simulating work
    Thread.SpinWait(5000000);

    lock (gate)
    {
        if (isCancellationRequested)
        {
            // perform cleanup if necessary
            //...
            // terminate the operation
            break;
        }
    }
}

Ответ 2

Нить может быть:

  • Foreground: будет поддерживать ваши программы до завершения.
  • Фон: будет прекращен при закрытии приложения.

Когда вы создаете поток, по умолчанию используется передняя часть.

Вы можете изменить это следующим образом:

Thread t = new Thread(myAction);
t.IsBackground = true;
t.Start();