C#/.NET 4.0+ 实现可取消后台线程的方法是什么?

What is the C#/.NET 4.0+ way to implement a cancellable background thread?

在 .NET 4.0 之前,我的理解是,如果想启动一个线程来做一些可以取消的工作,那么会启动一个 BackgroundWorker。 .NET 4 带来了 TAP 模型,以及一大堆新的异步和线程内容。 BackgroundWorker 仍然是这样做的方法吗?

请注意 async(和推论关键字 await)都是 .NET 4.5,在 4.0 中不可用。如果您想完全使用 Tasks,我强烈建议您升级到 .NET 4.5。然而,即使在 4.0 中,也有一些重载方法可以选择使用 CancellationTokens 来取消 运行 工作。

编辑: 正如评论中指出的那样,are ways 在 .NET 4.0 上获得 async/await - 你只需要4.5 中工作更少,库支持更多。除非迫切需要 XP 支持,否则我不会推荐。

从 .NET 4.5 开始,BackgroundWorker class is not marked as [Obsolete],因此您没有理由不继续直接使用它。

The Thread class 包含一个直接的 .Abort() 方法,可用于创建可取消的 worker。请注意,此中止是通过在 运行 线程中抛出 ThreadAbortException 发生的,因此允许 catch 语句在线程中止时仍执行任何清理。

在现代代码中,我建议使用 Task.RunCancellationToken。相比之下,BackgroundWorker 取消样式相当复杂:它需要 DoWork 委托来监视它自己的 BackgroundWorker 实例,并将取消请求视为布尔值而不是异常。

我有一个 blog post 更详细。