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

标签 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);
    });
}

有没有一种方法可以停止所有输出 Console.WriteLine("Output2"); 的线程,但让那些运行该输出的线程 Console.WriteLine("Output"); ?

最佳答案

您可以使用 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();

关于c# - 停止使用 ThreadPool.QueueUserWorkItem 创建的具有特定任务的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13590154/

相关文章:

java - 中止 AWS S3 上传

c# - View 模型的单独项目到 "enforce"MVVM : How do I open dialogs?

c# - 将字符串 "20111027"转换为时区为 GMT 的 DateTime

android - 当设备旋转时调用 onDestroy 时线程会发生什么

c++ - 使用线程查找友好号码比 C++ 中的单线程花费更多时间

c - 为什么 GCC 会对 ARM Cortex-A9 产生非法的未对齐访问

c# - 编辑并继续在某个时候退出为我工作

c# - 给一句话设置颜色?

Java:如何使用 Thread.join

ruby - 在 Ruby 中出现参数错误时最好使用 abort() 或 raise() 吗?