Najlepszy sposób na konwersję metody asynchronicznej opartej na wywołaniu zwrotnym na oczekiwane zadanie

Jaki byłby najlepszy sposób na konwersję / zawinięcie „klasycznej” metody asynchronicznej, która używa wywołania zwrotnego do czegoś, co zwraca (oczekiwane) zadanie?

Na przykład, biorąc pod uwagę następującą metodę:

public void GetStringFromUrl(string url, Action<string> onCompleted);

Jedynym sposobem, jaki znam, aby zawinąć to w metodę zwracającą zadanie, jest:

public Task<string> GetStringFromUrl(string url)
{
     var t = new TaskCompletionSource<string>();

     GetStringFromUrl(url, s => t.TrySetResult(s));

     return t.Task;
}

Czy to jedyny sposób, aby to osiągnąć?

Czy istnieje sposób na zawinięcie wywołania do GetStringFromUrl (url, callback) w samym zadaniu (tzn. Samo wywołanie uruchomiłoby się wewnątrz zadania zamiast synchronicznie)

questionAnswers(2)

yourAnswerToTheQuestion