Question

J'étais de nouveau à la async-await méthode C# 5.0, et j'ai quelques questions dans mon esprit

  1. Quel est le meilleur moyen d'échapper à une async méthode si elle n'avait pas un argument d'entrée ou null vérifier?

  2. Quelle est la logique des flux de l'aide return; dans une Tâche async méthode (Dans certaines circonstances, il est devenu une boucle infinie)?

  3. Est CancellationToken ou Task.Yield mieux dans ce scénario?

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);
}
Était-ce utile?

La solution

La meilleure façon de "tomber sur un problème" à mon humble avis serait de jeter l'exception appropriée, mais vous pouvez tout simplement utiliser return; si vous préférez éviter les exceptions.

Cela va créer un formulaire/reproché à la tâche qui a été complété de manière synchrone, l'appelant à l'aide await obtenez un fini tâche et de continuer à utiliser le même fil.


  • CancellationToken permet l'appelant pour annuler l'opération, ce qui n'est pas le cas que vous décrivez.

  • Task.Yield ne pas mettre fin à toute opération, il est juste de permettre à d'autres tâches à exécuter pendant un certain temps et le reporte lui-même pour plus tard.

Autres conseils

Vous pouvez revenir en toute sécurité à partir d'une méthode asynchrone à tout moment.Dans votre cas (méthode retournant une Tâche), le compilateur va générer une tâche arrêtée, alors qu'un appelant en attente sur votre fonction sera de continuer.

Lors de la levée d'une exception à partir d'un async méthode il est capturé dans la tâche afin de ne pas être lancé jusqu'à ce que la tâche est observée par l'appelant Task.Wait(), Task.Result, en attendant la tâche ou de l'accès à l' Exceptions propriété de la tâche.

En termes d'arguments en entrée une façon de contourner ce problème c'est de diviser la méthode en deux parties, la première vérifie les arguments d'entrée et appelle ensuite la deuxième méthode, qui est async.Voir cette questions à répondre par Stephen Cleary pour un exemple.De cette façon, l'argument d'entrée exception sera levée tout de suite à l'extérieur de la tâche retournée par la méthode.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top