Я не понимаю что это, как работает и в каких случаях используется. Может кто-нибудь по-русски объяснить?
Ответ
Этот метод возвращает специальное значение, предназначенное для передачи оператору await, и в отрыве от этого оператора не имеющее смысла. Конструкция же await Task.Yield() делает довольно простую вещь — прерывает текущий метод и сразу же планирует его продолжение в текущем контексте синхронизации. Используется же эта конструкция для разных целей. Во-первых, эта конструкция может быть использована для немедленного возврата управления вызывающему коду. Например, при вызове из обработчика события событие будет считаться обработанным: protected override async void OnClosing(CancelEventArgs e)
{
e.Cancel = true;
await Task.Yield();
// (какая-то логика)
}
Во-вторых, эта конструкция используется для очистки синхронного контекста вызова. Например, так можно "закрыть" текущую транзакцию (ambient transaction): using (var ts = new TransactionScope()) {
// ...
Foo();
// ...
ts.Complete();
} async void Foo() {
// ... тут мы находимся в контексте транзакции
if (Transaction.Current != null) await Task.Yield();
// ... а тут его уже нет!
}
В-третьих, эта конструкция может очистить стек вызовов. Это может быть полезным, если программа падает с переполнением стека при обработке кучи вложенных продолжений. Например, рассмотрим упрощенную реализацию AsyncLock class AsyncLock
{
private Task unlockedTask = Task.CompletedTask; public async Task Lock()
{
var tcs = new TaskCompletionSource
Комментариев нет:
Отправить комментарий