Завершить или выйти из асинхронного метода C# с помощью " return"

Я был новичком в async-await метод C# 5.0 и у меня есть несколько вопросов в моей голове

  1. каков наилучший способ избежать async метод, если он не удалось входной аргумент или проверка null?

  2. каков логический поток использования return; в задаче async метод (в некоторых обстоятельствах он стал бесконечным циклом)?

  3. и 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. См.этой вопросы ответ Стивен Например, Клири. Таким образом, исключение входного аргумента будет сразу же выброшено за пределы задачи, возвращаемой методом.