асинхронное ожидание для виртуального метода - PullRequest
0 голосов
/ 03 октября 2018

В нашем старом синхронном приложении в нашем базовом классе было следующее:

public virtual bool ShouldSomethingHappen() => false;

Итак, идея заключается в том, что в производном классе можно сделать вызов в БД, чтобы определить, что-тодолжно произойти.

Итак, при переходе к ожидаемому коду мы сначала попробовали следующее в базовом классе:

public virtual async Task<bool> ShouldSomethingHappen()
{
    await Task.Yield();
    return false;
}

Казалось, что это работает нормально при запуске приложения, но это сломало нашинтеграционные тесты (где у нас много ожидаемых звонков) .... мы не могли понять, почему.

Но, изменив это на следующее, мы решили проблему:

public virtual async Task<bool> ShouldSomethingHappen() => Task.FromResult(false);

ТехническиВ чем разница между двумя подходами?

1 Ответ

0 голосов
/ 03 октября 2018

Возможно, что бы ни происходило в ваших интеграционных тестах после await Task.Yield(), он не был предназначен для работы в другом потоке.Task.Yield() заставляет метод продолжать выполнение остальной части метода в другом потоке.Когда вы используете Task.FromResult, вы возвращаете уже выполненное задание.Вы только что вернули завершенное задание, поэтому оно по-прежнему происходит в том же потоке.

Это можно проверить, изменив Task.FromResult(false) на Task.FromResult(false).ConfigureAwait(false). await Task.Delay(n).ConfigureAwait(false)

...