Завершить или выйти из асинхронного метода C# с помощью " return"
Я был новичком в async-await
метод C# 5.0
и у меня есть несколько вопросов в моей голове
каков наилучший способ избежать
async
метод, если он не удалось входной аргумент или проверка null?каков логический поток использования
return;
в задачеasync
метод (в некоторых обстоятельствах он стал бесконечным циклом)?и
CancellationToken
илиTask.Yield
fit лучше в этом сценарий?
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
. См.этой вопросы ответ Стивен Например, Клири. Таким образом, исключение входного аргумента будет сразу же выброшено за пределы задачи, возвращаемой методом.