2016-03-15 3 views
1

Представьте sitution, когда вызывающий абонент создает задачу:Задача :: ConfigureAwait - состояние гонки?

{ 
var tWithCapturedCtx = Task.Run(...); 
var tWithoutCapturedCtx = tWithCapturedCtx.ConfigureAwait(false); 

await tWithoutCapturedCtx; 
} 

Есть ли вероятность того, что tWithCapturedCtx будет выполняться так быстро, что продолжение будет выполняться на захваченном контексте?

+2

Ваше изменение полностью изменило вопрос и, вероятно, аннулировал существующие/принятые ответы. Пожалуйста, избегайте таких изменений - не стесняйтесь задавать новый вопрос, если вы считаете, что не правильно выразили свою проблему. Подумайте о возврате изменений. –

+0

@ user3284063: Я откат вашего редактирования, так как он задает другой вопрос. Пожалуйста, не стесняйтесь публиковать новый вопрос. –

ответ

1

Возможно ли, что tWithCapturedCtx будет выполняться так быстро, что продолжение будет выполнено в захваченном контексте?

Сорт.

Если tWithCapturedCtx уже завершено к моменту оценки await (что означает, что tWithoutCapturedCtx также уже завершен), то продолжения не существует. Метод async продолжает выполнять синхронно (в том же контексте).

Однако, если tWithCapturedCtx еще не закончена к тому времени, await оценивается (что означает tWithoutCapturedCtx также уже не закончил), то продолжение планируется без контекста захвата.

Существует еще одно, еще меньшее условие гонки между тем, когда await проверяет, завершено ли его выполнение, и когда await планирует продолжение. Если ожидаемое завершение в этом окне, то продолжение выполняется только синхронно (опять же, в том же контексте).

В заключение, ConfigureAwait(false) означает «Мне все равно, в каком контексте работает весь этот метод»; это не означает «запустить оставшуюся часть этого метода в пуле потоков». Если вы хотите сказать «запустите этот другой код в потоке пула потоков», используйте Task.Run.

+0

Все, спасибо. Другой вопрос: почему они не поместили параметр continueOnCapturedContext в подпись метода Task :: Run? Таким образом, первоначальная задача будет построена с точными знаниями, по которым контекст должен заканчиваться. – user3284063

+0

@ user3284063: Потому что это не ответственность задачи. Только код * вызывающего * знает, нужно ли ему возобновить запись в захваченном контексте или нет. Это «configure wait», а не «configure task». –

+0

@ Заметка на стороне стипендиата: OP отредактировал вопрос, который, как я считаю, значительно изменил проблему - пожалуйста, проверьте его и посмотрите, нужно ли откатить редактирование (или вы можете обновить ответ, также я думаю, что это будет несколько неправильно). –

0

ConfigureAwait называет до того, как продолжение добавляется к задаче. Продолжение добавляется к объекту, который настроен не на захват контекста, поэтому он не собирается захватывать контекст, когда его продолжение выполняется (это буквально то, что оно существует, оно не будет выполнять свою документальную цель, если это не так).

+0

Извините, я, вероятно, не был чист - посмотрите обновленный вопрос – user3284063

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

  • Нет связанных вопросов^_^