Поведение настройки ConfigureAwait и SynchronisationContext

В своем ответе Stephen Cleary объяснил, что когда ConfigureAwait(false) остальная часть метода будет выполняться в потоке пула потоков, если только Task Вы await Инг уже завершен.

Что понятно: если я использую ConfigureAwait(false) все, что выполняется после асинхронного вызова, будет выполнено в потоке пула потоков и, следовательно, не будет запущено в интерфейсе SynchronizationContext пользовательского интерфейса, в противном случае (особенно необходимо для таких вещей на основе пользовательского интерфейса, как textBox1.Text = data.Property) он работает в интерфейсе пользователя SynchronizationContext.

Что я не понимаю: await не значит, что Task Я жду, когда завершится всегда, прежде чем методы продолжаются? Так как же задача не может быть завершена, прежде чем продолжить?

2 ответа

Решение

Представь что-то вроде этого

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

Я думаю, что легко понять, что задача может быть выполнена еще до await task вызов.

В этом случае код после ожидания будет выполнен в том же контексте, даже если вы использовали .ConfigureAwait(false),

Важно понимать порядок приоритета. В частности, оператор точки (.) имеет более высокий приоритет, чем await, Итак, когда вы делаете:

await SomeMethodAsync().ConfigureAwait(false);

Это идентично

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

Итак ConfigureAwait оценивается до await выражение, которое фактически выполняет (асинхронное) ожидание.

Другие вопросы по тегам