Асинхронизация и ожидание, когда вызывающая сторона не асинхронная, а вызываемые методы - PullRequest
0 голосов
/ 11 октября 2018

Может ли кто-нибудь объяснить мне, что произойдет в следующей ситуации:

public int? getValue()
{
    return GetIntValue().Result;
}

public async Task<int?> GetIntValue()
{
    return await getId();
}

public async Task<int?> getId()
{
    return (await Context.Users.FirstOrDefaultAsync())?.AssignedUserId;
}

, и если эта ситуация будет иной:

public int? getValue()
{
    return getId().Result;
}

В принципе, мне интересно, если ждатьздесь выполнение будет продолжаться до того, как результат будет возвращен в любом (или обоих случаях), и если они отличаются, почему они отличаются?

Ответы [ 2 ]

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

Это приведет к одинаковому результату, оба будут ждать, пока пользователи не будут извлечены, поэтому метод getValue () вернет значение и не вернет ноль.

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

Это getId().Result; является блокирующим вызовом, который может привести к сценарию взаимоблокировки.Текущий поток выполнения будет блокироваться до тех пор, пока не будет вызвана возвращаемая функция.

С другой стороны, используя подход async/await, вы не будете блокировать.Поток, который обрабатывает этот вызов, будет остановлен и будет доступен для обработки другого вызова.Затем, когда ваш вызов функции будет завершен, результат будет обработан другим потоком пула потоков.

Теперь, как вышеупомянутый блокирующий вызов повлияет на ваше приложение, это зависит от типа вашего приложения.Например, если мы говорим о приложении Windows Forms или приложении WPF, и этот код будет выполняться в потоке пользовательского интерфейса, ваша форма будет зависать до завершения этого вызова.С другой стороны, если это приложение ASP.NET и у вас много запросов на сервер, это может привести к исчерпанию потоков ASP.NET, целью которых является обработка запросов, которые получает сервер.По-видимому, это приведет к тому, что приложение не будет отвечать на новые запросы, пока некоторые из полученных сервером запросов не получат свой ответ.

Что касается сценария тупика, пожалуйста, посмотрите на этот вопрос и особенно на первый ответ.При этом вы найдете ссылку на отличную статью на эту тему Не блокировать асинхронный код .

...