停止使用具有特定任务的ThreadPool.QueueUserWorkItem创建的线程

mad*_*do7 6 c# multithreading abort

假设我将这两个方法排成一个for循环

for (int i = 0; i < 100; i++)
{
    ThreadPool.QueueUserWorkItem(s =>
    {
        Console.WriteLine("Output");
        Thread.Sleep(1000);
    });
}

for (int i = 0; i < 100; i++)
{
    ThreadPool.QueueUserWorkItem(s =>
    {
        Console.WriteLine("Output2");
        Thread.Sleep(1000);
    });
}
Run Code Online (Sandbox Code Playgroud)

有没有办法停止输出的所有线程,Console.WriteLine("Output2");但保持那些输出运行的线程Console.WriteLine("Output");

jak*_*ket 15

你可以使用CancellationToken:

for (int i = 0; i < 100; i++)
{
    ThreadPool.QueueUserWorkItem(s =>
    {
        Console.WriteLine("Output");
        Thread.Sleep(1000);
    });
}

CancellationTokenSource cts = new CancellationTokenSource();

for (int i = 0; i < 100; i++)
{
    ThreadPool.QueueUserWorkItem(s =>
    {
        CancellationToken token = (CancellationToken) s;
        if (token.IsCancellationRequested)
            return;
        Console.WriteLine("Output2");
        token.WaitHandle.WaitOne(1000);
    }, cts.Token);
}

cts.Cancel();
Run Code Online (Sandbox Code Playgroud)

  • 如果使用<4.0,则可以使用ManualResetEvent替换取消令牌. (2认同)