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

StackOverflow https://stackoverflow.com//questions/25055749

Вопрос

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

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

  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);
}
Это было полезно?

Решение

Лучшим способом "потерпеть неудачу при решении какой-либо проблемы", ИМХО, было бы создать соответствующее исключение, но вы определенно можете просто использовать return; если вы предпочитаете избегать исключений.

Это создаст завершенную / сбойную задачу, которая была выполнена синхронно, поэтому вызывающий, использующий await получит готовую задачу и продолжит использовать тот же поток.


  • CancellationToken допускает звонивший чтобы отменить операцию, а это не тот случай, который вы описываете.

  • Task.Yield не завершает какую-либо операцию, она просто позволяет другим задачам выполняться в течение некоторого времени и переносит себя на более поздний срок.

Другие советы

Вы можете безопасно вернуться из асинхронного метода в любой момент.В вашем случае (метод, возвращающий задачу) компилятор сгенерирует завершенную задачу, поэтому любой вызывающий объект, ожидающий вашей функции, будет продолжен.

При выбрасывании исключения из async метод он фиксируется в задаче, поэтому он не генерируется до тех пор, пока задача не будет выполнена путем вызова Task.Wait(), Task.Result, ожидая выполнения задачи или получая доступ к Exceptions свойство задачи.

Что касается входных аргументов, один из способов обойти это - разделить метод на две части, первая проверяет входные аргументы, а затем вызывает второй метод, который async.Видишь это ответы на вопросы Стивена Клири для примера.Таким образом, исключение входного аргумента будет сразу же выдано за пределы задачи, возвращаемой методом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top