c# - 异步主 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 上运行它。
解决方案
如您所见,主要签名使用异步,因此在幕后创建了同步上下文。
不,事实并非如此。等待任务将(默认情况下)使用同步上下文,如果它从一个开始- 但它不会自动创建一个。控制台应用程序通常没有任何同步上下文,因此继续在线程池线程上执行。
如果您希望控制台应用程序使用同步上下文,您需要自己创建一个。Stephen Cleary 的AsyncEx 项目包含一个实现;有关更多详细信息,请参阅此 Stack Overflow 答案。
推荐阅读
- javascript - 如何使用循环生成最多 n 的数字?
- python - 省略十进制值
- docker - Docker Nginx-代理 TLS 1.2
- java - 如何从 android 10 和 android 11 的内部和外部存储中扫描/加载所有文件
- php - 注意:尝试访问第 15 行 H:\xampp\htdocs\ecommerce\app\libraries\Core.php 中 null 类型值的数组偏移量
- flutter - Flutter initState 未被调用
- javascript - JS:获取对角线行和列的嵌套循环?
- c# - LINQ:防止创建新对象,(如果对象存在,则附加到列表属性)
- gcc - 加载我的内核时,GRUB2 产生“找不到多引导头”错误
- java - 我有一个集合“客户”,其中我有一个集合“环境”的列表我想更新特定索引处的列表