Ответ 1
Лучший вариант, если это возможно в вашем приложении, - это аннулирование сотрудничества.
Поток автоматически останавливается, когда у него больше нет кода для выполнения. Таким образом, когда пользователь закрывает ваше приложение, вы устанавливаете флаг, указывающий, что ваш поток должен остановиться. Поток должен проверять время от времени, если флаг установлен и, если это так, прекратить получение записей с сервера и вернуться.
- Как отметил @Hans Passant, BackgroundWorker имеет встроенную поддержку для этого.
- Если вы можете обновить,.NET Framework 4.0 представляет целый набор новых классов, поддерживающих совместную отмену асинхронных операций.
В противном случае вы можете перевернуть свое собственное решение, например
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;
}
}
}