C# 如何取消任务类型集合中的特定任务

C# 如何取消任务类型集合中的特定任务,c#,.net,multithreading,task,C#,.net,Multithreading,Task,因此,我试图找出一种方法来取消特定的任务。 在这个例子中,我想取消它产生的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()

因此,我试图找出一种方法来取消特定的任务。 在这个例子中,我想取消它产生的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);
        }
    }
}
static async Task Main(字符串[]args)
{
var tasks=Enumerable.Range(0,3)。选择(x=>Task.Run(()=>
{
计数器();
}));
等待任务。何时(任务);
Console.ReadLine();
}
公共静态无效计数器()
{
while(true)
{
对于(int i=0;i<1000;i++)
{
控制台写入线(i);
}
}
}

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

如果您想单独取消启动的每个任务,您需要为其传递一个
取消令牌:

static async Task Main(字符串[]args)
{
var cancellationSources=Enumerable.Range(0,3)
.Select(=>new CancellationTokenSource())
.ToList();
var tasks=Enumerable.Range(0,3)。选择(x=>Task.Run(
()=>计数器(cancellationSources[x].令牌),
cancellationSources[x]。令牌
));
cancellationSources[1]。取消();
等待任务。何时(任务);
Console.ReadLine();
}
公共静态无效计数器(CancellationToken CancellationToken)
{
而(!cancellationToken.IsCancellationRequested)
{
//或者while(true)和token.ThrowIfCancellationRequested();改为抛出
对于(int i=0;i<1000;i++)
{
控制台写入线(i);
}
}
}

无法真正取消任务。我想你可以中止一个线程,但这通常是一个非常糟糕的主意。您需要在
Counter()
方法中写入逻辑,该方法在满足条件时导致循环退出。然后通过设置该条件“结束”任务,使其退出循环。例如,您可以使用
while(true)
,而不是
while(flag==true)
,并从主代码中设置
flag