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 中不可用。如果您想完全使用 Task
s,我强烈建议您升级到 .NET 4.5。然而,即使在 4.0 中,也有一些重载方法可以选择使用 CancellationToken
s 来取消 运行 工作。
编辑: 正如评论中指出的那样,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.Run
和 CancellationToken
。相比之下,BackgroundWorker
取消样式相当复杂:它需要 DoWork
委托来监视它自己的 BackgroundWorker
实例,并将取消请求视为布尔值而不是异常。
我有一个 blog post 更详细。
在 .NET 4.0 之前,我的理解是,如果想启动一个线程来做一些可以取消的工作,那么会启动一个 BackgroundWorker
。 .NET 4 带来了 TAP 模型,以及一大堆新的异步和线程内容。 BackgroundWorker
仍然是这样做的方法吗?
请注意 async
(和推论关键字 await
)都是 .NET 4.5,在 4.0 中不可用。如果您想完全使用 Task
s,我强烈建议您升级到 .NET 4.5。然而,即使在 4.0 中,也有一些重载方法可以选择使用 CancellationToken
s 来取消 运行 工作。
编辑: 正如评论中指出的那样,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.Run
和 CancellationToken
。相比之下,BackgroundWorker
取消样式相当复杂:它需要 DoWork
委托来监视它自己的 BackgroundWorker
实例,并将取消请求视为布尔值而不是异常。
我有一个 blog post 更详细。