2014-01-09 2 views
0

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

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

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

ответ

1

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

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

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

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

+0

спасибо, Dirk! Хорошо, хорошо, я понял! Всегда только представлял себе такие вещи, как «var result = await DoSomething(). ConfigureAwait (false);'. Но не означает ли это, что если вы вызываете что-то вроде моего примера, моя задача * всегда * завершена до выполнения остальной части метода и должна выполняться таким образом в контексте SynchronisationContext UI? – Batz

+0

Да, но вы не должны полагаться на это. Если вы * хотите * использовать код выполнения после 'await' в том же контексте, что и вызов метода async, не используйте' .ConfigureAwait'. – Dirk

+0

Я думаю, что было бы более целесообразно написать этот код следующим образом: 'var task = obj.SomeTaskAsync(); /* Сделайте несколько длинных вычислений */ var value = wait task.ConfigureAwait (false); 'Это потому, что' ConfigureAwait() 'имеет смысл только вместе с' await'. – svick

2

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

await SomeMethodAsync().ConfigureAwait(false); 

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

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

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

Смежные вопросы