[英]C# DataFlow: Wait for all tasks started by ConcurrentExclusiveSchedulerPair to finish
我有一個要執行的操作列表,可以在用戶交互時取消。 很簡單,但是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;
}
來自文檔
調用完成是可選的。 僅當您依賴Completion屬性通知所有處理已完成時,才有必要 。
因此,如果要在Completion
屬性上Wait
,則必須在調度程序上調用Complete()
。 對於數據流塊,此行為相同。 依賴於Completion
屬性,你必須在塊上調用Complete()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.