Завершите или выйдите из асинхронного метода C # с помощью “return”
-
21-12-2019 - |
Вопрос
Я был новичком в async-await
метод в C# 5.0
, и у меня есть несколько вопросов в голове
Каков наилучший способ избежать
async
метод, если он не прошел проверку входного аргумента или null?Каков логический ход использования
return;
в Задачеasync
метод (При некоторых обстоятельствах это становилось бесконечным циклом)?Является
CancellationToken
илиTask.Yield
лучше вписывается в этот сценарий?
public Func<AzureBlobInfo, string, Task> UploadSuccessCallBackAsync { get; set; }
private async Task OnUploadSuccessAsync(AzureBlobInfo info)
{
if (this.UploadSuccessCallBackAsync == null)
{
return;
}
var transactionType = this.FormData.Get("transactionType");
if (string.IsNullOrEmpty(transactionType))
{
transactionType = "unknown";
}
await this.UploadSuccessCallBackAsync(info, transactionType);
}
Решение
Лучшим способом "потерпеть неудачу при решении какой-либо проблемы", ИМХО, было бы создать соответствующее исключение, но вы определенно можете просто использовать return;
если вы предпочитаете избегать исключений.
Это создаст завершенную / сбойную задачу, которая была выполнена синхронно, поэтому вызывающий, использующий await
получит готовую задачу и продолжит использовать тот же поток.
CancellationToken
допускает звонивший чтобы отменить операцию, а это не тот случай, который вы описываете.Task.Yield
не завершает какую-либо операцию, она просто позволяет другим задачам выполняться в течение некоторого времени и переносит себя на более поздний срок.
Другие советы
Вы можете безопасно вернуться из асинхронного метода в любой момент.В вашем случае (метод, возвращающий задачу) компилятор сгенерирует завершенную задачу, поэтому любой вызывающий объект, ожидающий вашей функции, будет продолжен.
При выбрасывании исключения из async
метод он фиксируется в задаче, поэтому он не генерируется до тех пор, пока задача не будет выполнена путем вызова Task.Wait()
, Task.Result
, ожидая выполнения задачи или получая доступ к Exceptions
свойство задачи.
Что касается входных аргументов, один из способов обойти это - разделить метод на две части, первая проверяет входные аргументы, а затем вызывает второй метод, который async
.Видишь это ответы на вопросы Стивена Клири для примера.Таким образом, исключение входного аргумента будет сразу же выдано за пределы задачи, возвращаемой методом.