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

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

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

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

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

Другие вопросы по тегам