0

在他的回答中, 斯蒂芬解释说,当ConfigureAwait(false)被调用时,该方法的其余部分将在线程池线程上执行,除非Taskawait已经完成了。

什么是明确的:如果我使用ConfigureAwait(false)在异步调用之后执行的所有内容将在线程池线程上执行,因此不在 UI SynchronizationContext 中运行,否则(尤其是基于 UI 的东西需要textBox1.Text = data.Property)它在 UI SynchronizationContext 中运行。

我不明白的是:这await并不意味着Task我正在等待的总是在方法进行之前完成?那么Task怎么能不完成才继续呢?

4

2 回答 2

2

了解优先顺序很重要。特别是,点运算符 ( .) 的优先级高于await。所以,当你这样做时:

await SomeMethodAsync().ConfigureAwait(false);

这等同于:

var task = SomeMethodAsync();
var awaitable = task.ConfigureAwait(false);
await awaitable;

因此,ConfigureAwait在表达式之前计算await,实际上执行(异步)等待。

于 2014-01-09T13:44:44.663 回答
1

想象这样的事情

var task = obj.SomeTaskAsync();
// do some lengthy computation
var value = await task.ConfigureAwait(false);

我认为很容易看出该任务甚至可以在await task通话之前完成。

在这种情况下,等待之后的代码将在相同的上下文中执行,即使您使用了.ConfigureAwait(false).

于 2014-01-09T09:50:09.350 回答