C # DataFlow: дождаться завершения всех задач, запущенных ConcurrentExclusiveSchedulerPair - PullRequest
0 голосов
/ 15 марта 2019

У меня есть список операций, которые нужно выполнить, и я могу отменить их при взаимодействии с пользователем.Довольно просто, но ConcurrentExclusiveSchedulerPair .Completion никогда не заканчивается.Вот пример:

static void Main(string[] args)
{
    var taskSchedulerPair = new ConcurrentExclusiveSchedulerPair();
    var cts = new CancellationTokenSource();
    var optiions = new ExecutionDataflowBlockOptions
    {
        TaskScheduler = taskSchedulerPair.ConcurrentScheduler,
        CancellationToken = cts.Token,
        MaxDegreeOfParallelism = 5
    };
    var a1 = new ActionBlock<int>(new Func<int, Task<int>>(Moo), optiions);
    for (var i = 0; i < 20; i++) a1.Post(i);
    Console.WriteLine("Press any key to cancel...");
    Console.ReadKey(false);
    Console.WriteLine("Cancelling...");
    cts.Cancel();
    // taskSchedulerPair.Complete();
    taskSchedulerPair.Completion.Wait();
    // This never prints
    Console.WriteLine("Done.");
    Console.ReadKey(false);
}

public static async Task<int> Moo(int ms)
{
    Console.WriteLine("Starting: " + ms);
    await Task.Delay(4000);
    Console.WriteLine("Ending" + ms);
    return ms + 100;
}

1 Ответ

0 голосов
/ 17 марта 2019

Из документов

Вызов завершен необязательно. Это необходимо только в том случае, если вы полагаетесь на свойство Завершение для уведомления о том, что вся обработка завершена .

Итак, если вы хотите Wait в свойстве Completion, вам нужно вызвать Complete() в планировщике. Это поведение одинаково для блока потока данных; чтобы положиться на свойство Completion, вы должны вызвать Complete() в блоке.

...