首页 > 解决方案 > 异步主 c# 7.1 中的线程切换

问题描述

我遇到了 c# 7.1 的异步主要功能的问题。

这是一个示例项目的 github 链接,用于演示该问题:https ://github.com/xorpherion/CSharpAsyncMainProblem

该代码用作游戏循环的一部分。如您所见,主要签名使用异步,因此在幕后创建了同步上下文。

Timedloop 类是一种计时器,当当前时间超过限制时,它会尝试安排事件 (OnTick)。触发事件的方法有 3 种:SpinLoop、WaitLoopAsync 和 WaitLoop。SpinLoop 和 WaitLoop 的行为符合预期(OnTick 的单线程调度)。问题在于 WaitLoopAsync。我在这里期望的是也留在当前线程上,因为 .ConfigureAwait 未设置为“false”。但是当您运行代码时,您会在控制台上看到线程 ID 更改的消息。其他循环“类型”不会发生这种情况。

我的问题是:为什么没有在同一个线程上安排延续?

我在.net core 2.1 上运行它。

标签: c#async-await

解决方案


如您所见,主要签名使用异步,因此在幕后创建了同步上下文。

不,事实并非如此。等待任务将(默认情况下)使用同步上下文,如果它从一个开始- 但它不会自动创建一个。控制台应用程序通常没有任何同步上下文,因此继续在线程池线程上执行。

如果您希望控制台应用程序使用同步上下文,您需要自己创建一个。Stephen Cleary 的AsyncEx 项目包含一个实现;有关更多详细信息,请参阅此 Stack Overflow 答案


推荐阅读