Meilleur moyen de convertir la méthode asynchrone basée sur le rappel en tâche attendue

Quelle serait la meilleure façon de convertir / encapsuler une méthode asynchrone “classique” qui utilise un rappel vers quelque chose qui renvoie une tâche (attendue)?

Par exemple, avec la méthode suivante:

public void GetSsortingngFromUrl(ssortingng url, Action onCompleted); 

La seule façon dont je sais envelopper une méthode renvoyant une tâche est la suivante:

 public Task GetSsortingngFromUrl(ssortingng url) { var t = new TaskCompletionSource(); GetSsortingngFromUrl(url, s => t.TrySetResult(s)); return t.Task; } 

Est-ce la seule façon d’y parvenir?

Et existe-t-il un moyen d’encapsuler l’appel à GetSsortingngFromUrl (url, callback) dans la tâche elle-même (c.-à-d. Que l’appel lui-même serait exécuté à l’intérieur de la tâche plutôt que de manière synchrone)

Votre code est court, lisible et efficace, donc je ne comprends pas pourquoi vous cherchez des alternatives, mais je ne peux rien penser. Je pense que votre approche est raisonnable.

Je ne sais pas non plus pourquoi vous pensez que la partie synchrone est correcte dans la version originale, mais vous souhaitez l’éviter dans la version basée Task la Task . Si vous pensez que la partie synchrone risque de prendre trop de temps, corrigez-la pour les deux versions de la méthode.

Mais si vous voulez l’exécuter de manière asynchrone (c’est-à-dire sur le ThreadPool ) uniquement dans la version de la Task , vous pouvez utiliser Task.Run() :

 public Task GetSsortingngFromUrl(ssortingng url) { return Task.Run(() => { var t = new TaskCompletionSource(); GetSsortingngFromUrl(url, s => t.TrySetResult(s)); return t.Task; }); } 

Votre implémentation supposée est parfaitement adaptée à cela, en supposant que le rappel ne traite que les situations réussies. Que se passe-t-il actuellement si une exception se produit dans les bases asynchrones de l’implémentation GetSsortingngFromUrl? Il n’y a pas vraiment de moyen pour eux de propager cela au rappel d’Action … est-ce qu’ils l’avalent simplement et vous renvoient nul ou quelque chose?

La seule chose que je recommande est de suivre la nouvelle convention de nommer ces méthodes async avec le suffixe XXXAsync.