考虑一个 Microsoft .NET Framework 应用程序,它充分利用 async/await 工具来生成许多同时(或嵌套)任务。没有显着的“流”控制,即任务大多是独立的,不相互等待完成,因此都在竞争执行。
决定如何/何时调度或执行任务以及在哪个线程上的框架组件是什么?
从用户代码影响该机制的可能课程是什么?
编辑
我找到了一个很好的句子,它指出了我的问题所针对的地方:
每当代码等待一个等待者说它尚未完成的等待对象时(即等待者的 IsCompleted 返回 false),该方法需要暂停......
这里描述的时间点比我的问题晚了一步 - 有些东西已经处理了用户代码,构造了awaitable和awaiter,可能捕获了上下文并决定哪个线程将执行(或已经执行)任务。我在问那个“东西”。
我确实看到了用户代码如何影响框架采用的路线,但这些都是程序员的外部“受过教育”的决定。假设我们采取了我们可以影响的每一条可能的路线并使其过度饱和......我们正在努力打击一些设施,对吗?也许没有一句话的答案......如果我在下面的@Stephen 的回答中看到它的速度很慢,我很抱歉 - 我感谢你的帮助并继续挖掘。
(一些相关主题似乎在同步/等待抽象下更深入,如线程池、上下文。我应该朝那个方向挖掘吗?)
结束编辑
自定义 TaskScheduler 是(最佳)(唯一)答案吗?
出于问题的目的,我忽略了任何外部限制因素,例如资源匮乏(网络、I/O 饱和)或业务原因(人为限制)。或者通过尝试跟踪正在执行的内容等来破解用户代码节流等。