Résilier ou de sortie méthode Async C# avec “retour”
-
21-12-2019 - |
Question
J'étais de nouveau à la async-await
méthode C# 5.0
, et j'ai quelques questions dans mon esprit
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?Quelle est la logique des flux de l'aide
return;
dans une Tâcheasync
méthode (Dans certaines circonstances, il est devenu une boucle infinie)?Est
CancellationToken
ouTask.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);
}
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.