Стоит ли вызывать await при вызове асинхронного метода? - PullRequest
0 голосов
/ 22 мая 2019

Когда мы вызываем асинхронный метод, пока мы не ожидаем результата, мы можем сделать что-то еще, прежде чем ждать результата. Что-то вроде:

var resultTask = GetResultAsync();
//Do something else
var result = await resultTask;

Интересно, если я пропущу, чтобы дождаться результата, это вызовет какой-либо побочный эффект?

var resultTask = GetResultAsync();
if(GetSomeOtherBooleanValueMethod()){
    var result = await resultTask;
}else{
    //Some other logic here.
    //await resultTask will never happen in this block.
    return;
}

Ответы [ 4 ]

1 голос
/ 23 мая 2019

это вызовет какой-либо побочный эффект?

Эффект, который он вызывает, заключается в том, что ваше приложение никогда не узнает, когда завершится GetResultAsync.

В частности:

  • Ваш код не будет знать, если GetResultAsync завершится неудачей.
  • Ваш код может считать себя "выполненным", когда GetResultAsync все еще работает.Если ваше приложение закрывается, GetResultAsync будет прервано.Опять же, без каких-либо уведомлений.

Второй пункт особенно проблематичен для серверных платформ, таких как ASP.NET, которые могут выгружать ваш процесс, если он «готов», и, таким образом, завершать работу GetResultAsync, если он выполняется.

0 голосов
/ 22 мая 2019

Я думаю, что вывод можно сделать следующим образом: здесь нет очевидного побочного эффекта, так как код может быть построен, никакой ошибки не произойдет.Мы определенно можем вызвать асинхронный метод, но никогда не ожидаем получения результата.Однако это бесполезная трата ресурсов, единственное преимущество в том, что это может сэкономить некоторое время на обработку того, кто создает запрос.Но этого следует избегать, поскольку это не лучшая практика.

Если вы согласны, пожалуйста, проголосуйте за этот ответ, я решу пометить его как ответ, основанный на подсчете голосов.

0 голосов
/ 23 мая 2019

Это полностью зависит от того, что делает GetResultAsync();.Я предполагаю, основываясь на его имени, что все, что он делает, это извлекает значение из веб-службы, базы данных или чего-то еще.При этом, предполагая, что

  • GetResultAsync() на самом деле не имеет побочных эффектов
  • Вас не волнует результат в случае else
  • Метод GetResultAsync() не использует какой-либо общий или дефицитный ресурс или что-то в этом роде
  • Нет другого сценария, в котором GetResultAsync() может вызвать состояние гонки, если что-то еще зависит от его завершения до него.пробеги.Например, если преждевременное завершение процесса (например, из-за выхода из консольного приложения или чего-либо еще) может привести к тому, что GetResultAsync() что-то оставит в поврежденном состоянии, это будет проблемой.

, тогда проблем нет.

Третий момент стоит прокомментировать, потому что в этом случае это может вызвать состояние гонки.Вообще говоря, «общим ресурсом» может быть что угодно, от дескриптора файла до ограничения скорости API.

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

0 голосов
/ 22 мая 2019

Единственным побочным эффектом является то, что он не будет ждать вызова GetResultsAsync() в любой точке.Даже если вы хотите использовать result как в операторе if, так и после него, вы можете ожидать одну и ту же задачу несколько раз.

var resultTask = GetResultAsync();

ResultType result;
if(GetSomeOtherBooleanValueMethod()){
   result = await resultTask;
}else{
    //Some other logic here.
    //await resultTask will never happen in this block.
}
result = await resultTask; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...