Я предполагаю, что ваш существующий метод DoAsync
будет работать асинхронно.
В этом случае вы можете обернуть его так:
Task<string> DoAsyncTask()
{
var tcs = new TaskCompletionSource<string>();
DoAsync(result => tcs.TrySetResult(result));
return tcs.Task;
}
Я не вижу, как ваш существующий метод DoAsync
сообщает об асинхронных ошибках. Вы можете использовать TaskCompletionSource<T>.TrySetException
, чтобы при необходимости сообщить об асинхронной ошибке.