我有一个要执行的操作列表,可以在用户交互时取消。非常简单,但是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;
}
答案 0 :(得分:0)
从docs
呼叫完成是可选的。 仅当您依靠“完成”属性来通知所有处理已完成时才需要。
因此,如果要在Wait
属性上Completion
,则必须在调度程序上调用Complete()
。对于数据流块,此行为相同。要依靠Completion
属性,您必须在块上调用Complete()
。