【发布时间】:2018-07-25 12:08:16
【问题描述】:
我正在 C# 中尝试使用 token 或 thread.abort 停止所有线程,但两者都无法正常工作
int workerThreads = 1;
int portThreads = 0;
ThreadPool.SetMinThreads(workerThreads, portThreads);
ThreadPool.SetMaxThreads(workerThreads,portThreads);
foreach (string d in list)
{
var p = d;
ThreadPool.QueueUserWorkItem((c) =>
{
this.checker(p,cts.Token);
});
}`
用 checker 调用的函数构建如下:
private void checker(string f, object obj)
{
try
{
CancellationToken token = (CancellationToken)obj;
if (token.IsCancellationRequested)
{
MessageBox.Show("Stopped", "Checker aborted");
token.ThrowIfCancellationRequested();
cts = new CancellationTokenSource();
} //etc main features of fucntion are hidden from here
我想在调用 cts.Cancel(); 时正确停止所有线程;但每次都会出现: Stopped , checker aborted 并且不仅是一次,而且可能会为每个线程进程显示。如何一次显示消息并在同一时刻停止所有线程? 我还想设置一些在处理其他线程之前应该工作的最大线程数。我尝试使用 SetMaxThreads,但这似乎都不起作用。
【问题讨论】:
-
你为什么要启动一个线程来启动一个新线程?另外,为什么要将线程与 TPL 混合使用?
-
试图将最大线程数设置为 1 无法达到预期效果,ThreadPool 类会默默地将其增加到处理器内核数。在现代机器上总是超过 1 个。这样做没有意义,只需启动一个 single 线程并让它迭代列表。该循环也是 token.IsCancellationRequested 测试的正确位置,现在它永远不会工作,因为它在线程开始时永远不会正确。
标签: c# multithreading token threadpool