У меня есть список операций, которые нужно выполнить, и я могу отменить их при взаимодействии с пользователем.Довольно просто, но 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;
}