Как отменить определенную задачу в коллекции типа Task - PullRequest
0 голосов
/ 26 апреля 2019

Поэтому я пытаюсь найти способ отменить определенные задачи.В примере я хочу отменить 2 из 3 задач, которые он порождает

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, как мне это сделать?

1 Ответ

5 голосов
/ 26 апреля 2019

Вам нужно будет ввести 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...