【发布时间】:2018-04-27 23:17:30
【问题描述】:
谁能给我解释一下这是怎么回事?这是我在另一篇帖子中询问的答案 (Does await new Task(async () => Actually halt execution until finished?),但我并不真正理解部分评论...
异步等待——await——等待任务完成。那是 为什么它被称为“等待”。
它是异步的,因为如果任务未完成则等待 返回给调用者并在这个线程上做其他工作,直到 任务完成,此时等待之后的工作是 计划执行。
确保您了解 await 是任务的运算符。它不是 关于调用的调用约定。任何等待类型的表达式都可以是 等待;不要落入相信 await 会打电话的陷阱 异步。被调用的方法已经是异步的;那个任务 返回的是等待的东西。
它如何“等待任务完成”同时又“返回调用者并做其他工作”?
谢谢!
跟进:
我已经看到了响应,那么在下面的伪代码示例中应该发生什么?哪些任务会按顺序实际发生?
await new Task(async () =>
{
//Do stuff 1
Thread.Sleep(10000);
}
EventLog.Write("Do Stuff 2");
await new Task(async () =>
{
//Do stuff 3
Thread.Sleep(10000);
}
“Do Stuff 1”会执行,然后等待,然后“Do Stuff 2”会发生,然后“Do Stuff 3”会发生吗?还是会先执行“Do Stuff 1”,然后立即执行“Do Stuff 2”,然后再执行“Do Stuff 3”?
【问题讨论】:
-
它“逻辑上”等待,这意味着下一行只会在任务完成后执行。
-
方法被分成几部分。在遇到
await之前和之后。await之前的所有代码都是同步执行的。await之后的所有代码都安排为Continuation。所以它立即返回给调用者,然后当await完成时,其余代码被调用,在ThreadPool线程或捕获的SynchronizationContext -
应该注意的是,在windows GUI应用程序继续将在消息循环处于空闲状态后执行。
-
我已经根据你的例子更新了我的答案。
标签: c# async-await