我正在使用.NET中的线程池在后台进行一些Web请求,并且我想要一个“停止”按钮,以便取消所有线程,即使它们正在执行请求,所以简单的布尔值无法完成这项工作。如何实现呢?
你的情况基本上是 .NET 框架中取消模型的典型用例。
想法是创建一个 CancellationToken 对象,并将其提供给可能要取消的操作。您的操作偶尔检查令牌的 IsCancellationRequested 属性,或调用 ThrowIfCancellationRequested。
您可以使用 CancellationTokenSource 类创建 CancellationToken,并通过它请求取消。
此取消模型与 .NET Task Parallel Library 集成得很好,而且相当轻量级,比使用系统对象(如 ManualResetEvent)更轻量级(虽然那也是完全有效的解决方案)。
正确的处理方式是使用一个标志对象进行信号传递。
运行在这些线程中的代码需要定期检查该标志,以确定是否应该退出。
例如,ManualResetEvent 对象就非常适合此目的。
然后,您可以按如下方式要求线程退出:
evt.Set();
在线程中,您可以像这样检查它:
if (evt.WaitOne(0))
return; // or otherwise exit the thread
ThreadPool
并不是最好的选择,你应该使用Thread
,并在容器中管理所有线程(例如全局List<Thread>
),这样可以确保你对所有线程拥有完全的控制。