首页 > 解决方案 > 如何取消任务类型集合中的特定任务

问题描述

所以我试图找出一种取消特定任务的方法。在示例中,我想取消它产生的 3 个任务中的 2 个

static async Task Main(string[] args)
{

    var tasks = Enumerable.Range(0, 3).Select(x => Task.Run(() =>
    {
        Counter();
    }));



    await Task.WhenAll(tasks);

    Console.ReadLine();

}

public static void Counter()
{
    while (true)
    {
        for (int i = 0; i < 1000; i++)
        {
            Console.WriteLine(i);
        }
    }
}

如果我要这样做while (someProperty)并更改someProperty为,false那么所有线程都会停止。我想停止 2/3,我该怎么做?

标签: c#.netmultithreadingtask

解决方案


CancellationToken如果你想单独取消它们,你需要为你开始的每个任务传递一个:

static async Task Main(string[] args)
{
    var cancellationSources = Enumerable.Range(0, 3)
      .Select(_ => new CancellationTokenSource())
      .ToList();

    var tasks = Enumerable.Range(0, 3).Select(x => Task.Run(
        () => Counter(cancellationSources[x].Token),
        cancellationSources[x].Token
    ));

    cancellationSources[1].Cancel();

    await Task.WhenAll(tasks);

    Console.ReadLine();

}

public static void Counter(CancellationToken cancellationToken)
{
    while (!cancellationToken.IsCancellationRequested)
    {
        // or while(true) and token.ThrowIfCancellationRequested(); to throw instead

        for (int i = 0; i < 1000; i++)
        {
            Console.WriteLine(i);
        }
    }
}

推荐阅读