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() et EndXxx() 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.