Поведение настройки 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
выражение, которое фактически выполняет (асинхронное) ожидание.