C#中调用Refresh异步方法时TestAgain为什么等待TestOnly执行完成?
原因解析
你观察到的现象是await关键字的标准执行逻辑,核心原因是顺序await异步任务时,后续代码会等待前一个await的任务完全执行完成后才会继续执行。
具体到你的代码执行流程:
Refresh方法运行时,首先执行await TestOnly();,这行代码会直接挂起Refresh方法的执行,直到TestOnly的所有逻辑完全走完:包括10秒的Task.Delay等待、asyncTest.txt文件写入、返回结果100之后,才会恢复Refresh的执行。- 等
TestOnly完全执行完成后,才会开始执行下一行的await TestAgain();,所以TestAgain的所有操作必然晚于TestOnly执行,就出现了你看到的结果。
如果要实现你预期的两个任务并行执行、TestAgain先完成写入的效果,可以调整Refresh的写法,先启动两个异步任务再统一等待:
private async Task Refresh() { // 先启动两个异步任务,不立刻等待,两个任务会并行运行 var testOnlyTask = TestOnly(); var testAgainTask = TestAgain(); // 等待两个任务全部执行完成 await Task.WhenAll(testOnlyTask, testAgainTask); }
调整后TestOnly和TestAgain会几乎同时启动,TestAgain因为只有Task.Delay(0)会很快完成写入,TestOnly等待10秒后才写入,符合你最初的预期。
内容的提问来源于stack exchange,提问作者user3856437
相关产品推荐
相关产品推荐

