9

假设我将这两种方法排成一个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);
    });
}

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

4

2 回答 2

18

您可以使用 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();
于 2012-11-27T18:08:52.690 回答
2

不,你不能那样做。如果你想做一些很长的事情,那么你必须编写一些代码来管理它。在最基本的层面上,你需要这样的东西:

object syncObject = new object();
bool shouldOutput2 = true;
ThreadPool.QueueUserWorkItem(s =>
{
    lock(syncObject)
    {
        if(!shouldOutput2)
        {
           return;
        }
    }
    Console.WriteLine("Output2");
    Thread.Sleep(1000);
});

将项目排队后,您可以设置标志以告诉剩余项目不要执行:

   lock(syncObject)
   {
        shouldOutput2 = false;
   }

这是一种非常肮脏的方式,但对于您的示例来说,这似乎是唯一的方式。如果您可以告诉我们更多关于您尝试完成的实际实际行为是什么,那么可能会有一些更好的选择。

于 2012-11-27T18:09:55.573 回答