我有以下代码示例:
using System;
using System.Threading;
using System.Threading.Tasks;
namespace asynctest {
class Program {
public static void Main (string[] args) {
var program = new Program ();
program.run ();
}
public Program () {
}
public void run () {
asynctest ();
Console.WriteLine ("Sync");
while (true) {
}
}
public async Task asynctest () {
await Task.Delay (100);
Console.WriteLine ("Async");
}
}
}
启动此程序时,我希望输出只是“同步”,因为asynctest方法永远不会在我的代码中继续。
相反,它输出“同步”和“异步”。
现在我的问题是程序从run方法切换到asynctest方法以打印“Async”行。根据我以前使用协同程序的经验,这不应该发生。
答案 0 :(得分:1)
从控制台程序启动的任务默认情况下在线程池上运行,因此您的程序开始在线程A上运行。调用asynctest
方法,一旦遇到await Task.Delay (100);
,它就会返回然后继续写出Sync
字符串。然后在while
循环上阻塞A块。
编译器使用asynctest
方法构建状态机,该方法在Task.Delay(100)
完成后继续在线程池线程B上执行并打印Async
。然后线程B终止。线程A仍然卡在while
循环上。
如果你从UI线程调用它,你会遇到死锁,因为await
将尝试在UI线程上执行asynctest
方法的剩余部分,而后者又在{{{ 1}}循环。
查看this article,它解释了有关while(true)
和async
最佳做法的更多信息。