【发布时间】:2016-01-09 03:48:09
【问题描述】:
经过两个问题和很多困惑 - 我想知道我是否最终做对了。这是我的理解:
async/await只有一个目的 - 允许在已经异步任务完成后执行代码。
例如
async Task CallerMethod()
{
await AsyncMethod();
AnotherMethod();
}
允许AnotherMethod 在异步AsyncMethod完成之后执行,而不是在AsyncMethod开始之后立即执行。
async/await 永远不要使任何东西异步。它不会启动单独的线程(当然,除非等待的方法这样做),等等。
我的理解(最终)正确吗?
【问题讨论】:
-
是的,这听起来很对 - 但请注意,即使
AsyncMethod没有产生线程,您也可能会在另一个线程上结束 - 您的回调可以在任何线程池线程中产生 -
@Carsten 谢谢。假设
callback你的意思是AnotherMethod();- 这将有一个非常重要的含义 - 我无法从中更新 UI - 这是真的吗? -
不,您可以安全地从中更新 UI。这样做的原因是每个线程都有一个
SynchronizationContext,async/await 生成的代码使用它来调度完成异步方法的回调。在 WPF 的情况下(例如),该类是一个DispatcherSynchronizationContext,它确保在必要时将该方法调用回 Dispatcher 线程。 WinForms 有一个类似的类。 -
@TimDestan 感谢您的澄清!
标签: c# .net multithreading asynchronous async-await