首页 > 解决方案 > 如何使 ConcurrentExclusiveSchedulerPair 与 async 和 await 一起工作

问题描述

我有以下代码:

static async Task Main()
{
    ConcurrentExclusiveSchedulerPair concurrentExclusiveSchedulerPair = new ConcurrentExclusiveSchedulerPair(TaskScheduler.Default, 4);
    var factory = new TaskFactory(concurrentExclusiveSchedulerPair.ConcurrentScheduler);
    for (int i = 0; i < 10; i++)
    {
        factory.StartNew(ThreadTask);
    }

    concurrentExclusiveSchedulerPair.Complete();

    await concurrentExclusiveSchedulerPair.Completion;
    Console.WriteLine("Completed");
}

private static async Task ThreadTask()
{
    var random = new Random();
    await Task.Delay(random.Next(100, 200));
    Console.WriteLine($"Finished {Thread.CurrentThread.ManagedThreadId}");
}

并且程序在任务完成之前完成执行。我理解为什么它会在ThreadTask返回完成的任务时发生,并且从ConcurrentExclusiveSchedulerPair它的角度来看它确实完成了执行。我也知道一些解决方法,但是有没有正确的方法来异步运行这个模式?

标签: c#multithreadingtasktask-parallel-library

解决方案


的概念是TaskScheduler在 async/await 出现之前设计的,但最终与它不兼容。您可以在此处查看演示此不兼容性的实验:如何使用 await 在自定义 TaskScheduler 上运行任务?

可用于控制 async/await 行为的抽象是SynchronizationContext. 它与 a 非常相似TaskScheduler。实际上,有些人一直想知道为什么我们需要两者:SynchronizationContext 和 TaskScheduler 之间的概念区别是什么

如果你对类似 a 的东西感兴趣SingleThreadSynchronizationContext,你可以在这里找到一个实现:Await, SynchronizationContext, and Console Apps


推荐阅读