Языковая поддержка async позволяет ожидающим управлять собственным расписанием.Существует планирование по умолчанию, которое срабатывает, когда вы ожидаете Задачу, но есть много способов изменить поведение по умолчанию, добавив немного больше кода.
В частности, await предназначен для выполнения следующих действий:
- Проверка, чтобы увидеть, выполнено ли ожидаемое (GetAwaiter (). IsCompleted).
- Если (и только если) ожидаемое не было выполнено, попросите его запланировать остальныеметода (GetAwaiter (). OnCompleted (...))
- «Осуществить» ожидаемый результат.Это означает, что нужно либо вернуть возвращаемое значение, либо убедиться, что возникшие исключения снова возникли.
Так что имейте в виду, что если ожидаемое заявило, что оно «выполнено», то ничего не запланируется.
Task.Yield () является новым, поскольку он возвращает ожидаемое, которое никогда выполнено, с явной целью дать вам способ явно прекратить выполнение на данный момент и немедленнозапланировать все остальное для исполнения.Он использует окружающий контекст, но есть много других способов сделать то же самое без окружающего контекста.
Примером переопределения поведения по умолчанию является случай, когда вы ожидаете незавершенную задачу, но используете ConfigureAwait (false) метод.ConfigureAwait (false) оборачивает задачу в специальное ожидание, что всегда использует планировщик задач по умолчанию, эффективно всегда возобновляя работу в пуле потоков.«Ложь» предназначена для явного игнорирования окружающего контекста синхронизации.
Не существует Task.Yield (). ConfigureAwait (false), но рассмотрим следующую гипотетическую:
// ... A ...
await Task.Yield().ConfigureAwait(false);
// ... B ...
Вышесказанное может быть в значительной степени достигнуто с помощью
// ... A ...
await Task.Run(() => {
// ... B ...
});
Там есть немного больше ясности и вложенности, но это не обязательно плохо, учитывая то, что происходит.Часть 'A' всегда выполняется в вызывающем потоке, тогда как часть 'B' всегда выполняется в пуле потоков.Существуют определенные различия в том, как вы должны смотреть на код, который находится в разделах A и B, поэтому, таким образом, наличие нескольких кратких переходов между ними должно заставить людей сделать паузу, прежде чем предположить, что оба раздела имеют одинаковый контекст.