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

Mer*_*ith 4 c# multithreading visual-studio-2010 threadpool

我在.NET中使用ThreadPool在后台发出一些Web请求,我希望有一个"停止"按钮来取消所有线程,即使它们正在发出请求,所以一个简单的bool不会这样做工作.

我怎样才能做到这一点?

Wes*_*ill 9

您的情况几乎是.NET框架中的Cancellation模型的规范用例.

我们的想法是创建一个CancellationToken对象,并使其可用于您可能要取消的操作.您的操作偶尔会检查令牌的IsCancellationRequested属性,或者调用ThrowIfCancellationRequested.

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

这个取消模型很好地与.NET 任务并行库集成,并且非常轻量级,比使用诸如ManualResetEvent之类的系统对象更加轻松(尽管这也是一个非常有效的解决方案).


ang*_*son 5

处理此问题的正确方法是使用您发出信号的标志对象.

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

例如,ManualResetEvent对象适用于此.

然后你可以让线程像这样退出:

evt.Set();
Run Code Online (Sandbox Code Playgroud)

在线程中,你会检查它是这样的:

if (evt.WaitOne(0))
    return; // or otherwise exit the thread
Run Code Online (Sandbox Code Playgroud)

其次,既然您正在使用线程池,那么您所排队的所有项目仍将被处理,但如果您将上面的if语句添加到线程方法的最开头,它将立即退出.如果这还不够好,你应该使用普通线程构建自己的系统,这样你就可以完全控制.

哦,只是为了确保,不要使用Thread.Abort.让线程很好地退出,不要彻底杀死它们.