在.NET线程池中停止所有线程?

6
我正在使用.NET中的线程池在后台进行一些Web请求,并且我想要一个“停止”按钮,以便取消所有线程,即使它们正在执行请求,所以简单的布尔值无法完成这项工作。如何实现呢?
3个回答

10

你的情况基本上是 .NET 框架中取消模型的典型用例。

想法是创建一个 CancellationToken 对象,并将其提供给可能要取消的操作。您的操作偶尔检查令牌的 IsCancellationRequested 属性,或调用 ThrowIfCancellationRequested

您可以使用 CancellationTokenSource 类创建 CancellationToken,并通过它请求取消。

此取消模型与 .NET Task Parallel Library 集成得很好,而且相当轻量级,比使用系统对象(如 ManualResetEvent)更轻量级(虽然那也是完全有效的解决方案)。


5

正确的处理方式是使用一个标志对象进行信号传递。

运行在这些线程中的代码需要定期检查该标志,以确定是否应该退出。

例如,ManualResetEvent 对象就非常适合此目的。

然后,您可以按如下方式要求线程退出:

evt.Set();

在线程中,您可以像这样检查它:

if (evt.WaitOne(0))
    return; // or otherwise exit the thread

其次,由于您正在使用线程池,所以所有排队的项目仍将被处理,但如果在线程方法的开头添加上述if语句,则会立即退出。如果这还不够好,您应该使用普通线程构建自己的系统,这样您就可以完全控制。
哦,只是为了确保,请不要使用Thread.Abort。请求线程优雅地退出,不要完全终止它们。

2
如果你要停止/取消另一个线程中的某些处理,ThreadPool并不是最好的选择,你应该使用Thread,并在容器中管理所有线程(例如全局List<Thread>),这样可以确保你对所有线程拥有完全的控制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接