设置ConfigureAwait和SynchronisationContext的行为

时间:2014-01-09 09:45:08

标签: c# async-await synchronizationcontext

在他的answer Stephen中解释说,当调用ConfigureAwait(false)时,方法的其余部分将在线程池线程上执行,除非Task你' re await已经完成。

清楚的是:如果我使用ConfigureAwait(false)异步调用之后执行的所有内容都将在线程池线程上执行,因此不会在UI SynchronizationContext中运行,否则(尤其需要基于UI的事件,如{{1}它在UI SynchronizationContext中运行。

我不明白的是:textBox1.Text = data.Property并不意味着我等待的await 总是在方法进行之前完成了吗?那么在继续之前如何才能完成任务呢?

2 个答案:

答案 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)