Самая безопасная форма отмены - всегда кооперативная.
Я рекомендую никогда не убивать поток (через ThreadAbortException
). Если у вас абсолютно нет выбора, сделайте этот код отдельным процессом , который можно просто убить. Домены приложений были хорошей идеей, но они не соответствуют реальному миру.
IAsyncResult
, BackgroundWorker
и CancellationToken
- все это формы совместного отмены. Таким образом, все они очень чистые (не теряют ресурсы, вызывают блоки finally
, ...), но имеют недостаток, заключающийся в том, что они не могут обрабатывать «мошеннический» код.
Если вы пишете код фоновой задачи, просто используйте BackgroundWorker
или CancellationToken
. Если вам нужно работать с, возможно, «мошенническим» кодом, оберните его в отдельный процесс.
BackgroundWorker
будет отлично работать в ASP.NET, а поддерживает совместное аннулирование .