Обертывание существующего асинхронного метода в TPL-совместимый метод - PullRequest
3 голосов
/ 09 января 2012

Как обернуть существующий асинхронный метод, который принимает функцию обратного вызова в качестве параметра, в метод, совместимый с Task Parallel Library?

// Existing method
void DoAsync(Action<string> callback) {
    ...
}

// The desired method should have similar prototype
Task<string> DoAsync() {
    // Internally this method should call existing
    // version of DoAsync method (see above)
}

1 Ответ

3 голосов
/ 09 января 2012

Я предполагаю, что ваш существующий метод DoAsync будет работать асинхронно.

В этом случае вы можете обернуть его так:

Task<string> DoAsyncTask()
{
  var tcs = new TaskCompletionSource<string>();
  DoAsync(result => tcs.TrySetResult(result));
  return tcs.Task;
}

Я не вижу, как ваш существующий метод DoAsync сообщает об асинхронных ошибках. Вы можете использовать TaskCompletionSource<T>.TrySetException, чтобы при необходимости сообщить об асинхронной ошибке.

...