c#中的异步方法:连续点
本文关键字:连续 异步方法 | 更新日期: 2023-09-27 18:00:26
我有以下代码示例:
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");
}
}
}
当启动这个程序时,我希望输出只是"Sync",因为异步测试方法在我的代码中永远不会继续。
相反,它同时输出"同步"answers"异步"。
我现在的问题是,程序究竟在哪里从run方法切换到asynctest方法来打印"Async"行。从我以前的合作经历来看,这种情况不应该发生。
asynctest
方法被调用,一旦遇到await Task.Delay (100);
,它就会返回,然后继续写入Sync
字符串。然后线程A阻塞while
循环。
编译器用asynctest
方法构建了一个状态机,在Task.Delay(100)
完成后,它将在线程池线程B上恢复执行并打印Async
。然后线程B终止。线程A仍然卡在while
循环上。
如果从UI线程调用此方法,则会出现死锁,因为await
将尝试在UI线程上执行asynctest
方法的其余部分,而该方法又在while(true)
循环中被阻止。
看看这篇文章,它对async
和await
的最佳实践进行了更多的解释。