c# - 如何使 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
它的角度来看它确实完成了执行。我也知道一些解决方法,但是有没有正确的方法来异步运行这个模式?
解决方案
的概念是TaskScheduler
在 async/await 出现之前设计的,但最终与它不兼容。您可以在此处查看演示此不兼容性的实验:如何使用 await 在自定义 TaskScheduler 上运行任务?
可用于控制 async/await 行为的抽象是SynchronizationContext
. 它与 a 非常相似TaskScheduler
。实际上,有些人一直想知道为什么我们需要两者:SynchronizationContext 和 TaskScheduler 之间的概念区别是什么。
如果你对类似 a 的东西感兴趣SingleThreadSynchronizationContext
,你可以在这里找到一个实现:Await, SynchronizationContext, and Console Apps
推荐阅读
- javascript - 在另一个函数中调用异步函数是否也会使另一个函数异步?
- xslt - 存储数据以在流式传输期间使用
- python - 多项式除法算法
- python - 使用python替换文件中的功能块
- python - 使用 np.select 选择两个 pandas 列
- reactjs - 如何在第一次渲染时使用反应挂钩更新状态变量
- html - 如何在背景颜色之上显示背景图像?
- python - Python celery 在 redis 上创建了很多连接
- azure - Azure OAuth 流在重定向到客户端应用程序时丢弃 cookie
- asp.net - AspNet Web Api 自定义路径不适用于路径路径中的 .json 结尾