Лучший способ преобразовать асинхронный метод на основе обратного вызова в ожидаемую задачу

Как лучше всего преобразовать / обернуть «классический» файл? асинхронный метод, который использует обратный вызов к чему-то, что возвращает (ожидаемое) задание?

Например, дан следующий метод:

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

Единственный известный мне способ обернуть это в метод, возвращающий задачу:

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

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

     return t.Task;
}

Это единственный способ сделать это?

И есть ли способ обернуть вызов GetStringFromUrl (url, callback) в саму задачу (то есть сам вызов будет выполняться внутри задачи, а не синхронно)

Ответы на вопрос(2)

Ваш ответ на вопрос