在他的answer Stephen中解释说,当调用ConfigureAwait(false)
时,方法的其余部分将在线程池线程上执行,除非Task
你' re await
已经完成。
清楚的是:如果我使用ConfigureAwait(false)
异步调用之后执行的所有内容都将在线程池线程上执行,因此不会在UI SynchronizationContext中运行,否则(尤其需要基于UI的事件,如{{1}它在UI SynchronizationContext中运行。
我不明白的是:textBox1.Text = data.Property
并不意味着我等待的await
总是在方法进行之前完成了吗?那么在继续之前如何才能完成任务呢?
答案 0 :(得分:2)
了解优先顺序非常重要。特别是,点运算符(.
)的优先级高于await
。所以,当你这样做时:
await SomeMethodAsync().ConfigureAwait(false);
这与:
相同var task = SomeMethodAsync();
var awaitable = task.ConfigureAwait(false);
await awaitable;
因此,在ConfigureAwait
表达式之前评估await
,这实际上是(异步)等待。
答案 1 :(得分:1)
想象一下这样的事情
var task = obj.SomeTaskAsync();
// do some lengthy computation
var value = await task.ConfigureAwait(false);
我认为很容易看到即使在await task
电话之前也可以完成任务。
在这种情况下,await之后的代码将在相同的上下文中执行,即使您使用了.ConfigureAwait(false)
。