我遇到了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上运行它。
答案 0 :(得分:6)
如您所见,主签名使用了异步,因此在后台创建了一个同步上下文。
不,不是这样。等待任务(默认情况下)将使用同步上下文(如果它在一个任务中启动)-但不会自动创建一个任务。控制台应用程序通常没有任何同步上下文,因此继续在线程池线程上执行。
如果您希望控制台应用程序使用同步上下文,则需要自己创建一个。 Stephen Cleary的AsyncEx project包含一个实现;有关更多详细信息,请参见this Stack Overflow answer。