Знаете, иногда проще всего работать с BackgroundWorker независимо от того, используете ли вы Windows Forms, WPF или какую-либо другую технологию. Отличная часть этих парней в том, что вы получаете многопоточность, не беспокоясь о том, где исполняется нить, что отлично подходит для простых задач.
Прежде чем использовать BackgroundWorker
, сначала подумайте, хотите ли вы отменить поток (закрытие приложения, отмена пользователя), а затем вам нужно решить, должен ли ваш поток проверять отмены или он должен быть наложен на само выполнение.
BackgroundWorker.CancelAsync()
установит CancellationPending
на true
, но больше ничего не будет делать, тогда ответственность за непрерывную проверку потоков будет нести ответственность, также имейте в виду, что в этом подходе вы можете столкнуться с состоянием гонки. Ваш пользователь отменил, но поток завершен до тестирования на CancellationPending
.
Thread.Abort()
, с другой стороны, вызовет исключение в выполнении потока, которое вызывает отмену этого потока, однако вы должны быть осторожны с тем, что может быть опасно, если это исключение внезапно возникло в ходе выполнения.
Потоки нуждаются в очень тщательном рассмотрении независимо от задачи, для дальнейшего чтения:
Параллельное программирование в .NET Framework
Рекомендации по управляемым потокам