Le meilleur moyen de convertir de rappel à base de méthode asynchrone à awaitable tâche
Quel serait le meilleur moyen de convertir/wrap "classique", asynchrone de la méthode qui utilise un rappel de quelque chose qui renvoie un (awaitable) Tâche?
Par exemple, pour la méthode suivante:
public void GetStringFromUrl(string url, Action<string> onCompleted);
Le seul moyen que je connaisse pour le couvrir dans une méthode retournant une tâche est:
public Task<string> GetStringFromUrl(string url)
{
var t = new TaskCompletionSource<string>();
GetStringFromUrl(url, s => t.TrySetResult(s));
return t.Task;
}
Est-ce la seule façon d'accomplir cette?
Et est-il un moyen de placer l'appel GetStringFromUrl(url,callback) dans la tâche elle-même (c'est à dire l'appel lui-même irait à l'intérieur de la tâche à accomplir plutôt que de manière synchrone)
- BTW, ce n'est pas “classique” .net méthode asynchrone. Ceux-ci sont
BeginXxx()
etEndXxx()
paires. Aussi, pourquoi êtes-vous à la recherche d'autres façons de le faire? Qu'espérez-vous gagner? - Je veux juste m'assurer que je ne suis pas en manque quelques une solution évidente façon de faire la même chose.
Vous devez vous connecter pour publier un commentaire.
Votre code est court, lisible et efficace, donc je ne comprends pas pourquoi vous êtes à la recherche d'alternatives, mais je ne peux pas penser à quelque chose. Je pense que votre approche est raisonnable.
Je suis également pas sûr de savoir pourquoi pensez-vous que la partie synchrone est bien dans la version originale, mais vous voulez éviter à l'
Task
basée sur un. Si vous pensez que le synchrone partie pourrait prendre trop de temps, fixer, pour les deux versions de la méthode.Mais si vous voulez l'exécuter de manière asynchrone (c'est à dire sur la
ThreadPool
) que dans lesTask
version, vous pouvez utiliserTâche.Run()
:Votre assumé la mise en œuvre est parfaitement bien pour cela en supposant que la fonction de rappel n'a jamais poignées de succès situations. Ce qui se passe si une exception se produit à l'intérieur de la async fondements de la GetStringFromUrl mise en œuvre? Il n'y a pas de véritable moyen pour eux de se propager qu'à l'Action de rappel... n'ont-ils simplement avaler et vous retourne la valeur null ou quelque chose?
La seule chose que je recommande est d'utiliser à la suite de la nouvelle convention de nommage de ces méthodes asynchrones avec la XXXAsync suffixe.