C#DataFlow:等待由ConcurrentExclusiveSchedulerPair启动的所有任务完成

时间:2019-03-15 14:39:41

标签: c# asynchronous task-parallel-library tpl-dataflow

我有一个要执行的操作列表,可以在用户交互时取消。非常简单,但是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 :(得分:0)

docs

  

呼叫完成是可选的。 仅当您依靠“完成”属性来通知所有处理已完成时才需要

因此,如果要在Wait属性上Completion,则必须在调度程序上调用Complete()。对于数据流块,此行为相同。要依靠Completion属性,您必须在块上调用Complete()