Завершить или выйти из асинхронного метода C# с помощью "return"
Я был новичком в async-await
метод в C# 5.0
и у меня есть несколько вопросов в моей голове
Каков наилучший способ избежать
async
метод, если он не прошел входной аргумент или проверка на ноль?Каков логический поток использования
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);
}
3 ответа
ИМХО лучший способ "потерпеть неудачу при какой-то проблеме" - это выбросить соответствующее исключение, но вы определенно можете просто использовать return;
если вы предпочитаете избегать исключений.
Это создаст завершенную / ошибочную задачу, которая была выполнена синхронно, поэтому вызывающая сторона использует await
получит законченное задание и продолжит использовать тот же поток.
CancellationToken
позволяет вызывающей стороне отменить операцию, а это не тот случай, который вы описываете.Task.Yield
не завершает никакие операции, он просто позволяет другим задачам работать некоторое время и переназначает себя на потом.
Вы можете безопасно вернуться из асинхронного метода в любой момент. В вашем случае (метод, возвращающий задачу) компилятор сгенерирует завершенную задачу, поэтому любой вызывающий объект, ожидающий выполнения вашей функции, продолжит работу.
При создании исключения из async
метод, который захватывается в задаче, поэтому он не будет брошен, пока задача не будет обнаружена путем вызова Task.Wait()
, Task.Result
в ожидании задания или доступа к Exceptions
свойство задачи.
В терминах входных аргументов один из способов обойти это разделить метод на две части, первая проверяет входные аргументы, а затем вызывает второй метод, который async
, Посмотрите на этот вопрос ответ Стивена Клири для примера. Таким образом, исключение входного аргумента будет выброшено сразу за пределы задачи, возвращаемой методом.