Должен ли я переписать свой код с нуля с помощью async/await, или я могу просто использовать Task.FromAsync и TaskComplitionSource для переноса классов более высокого уровня?

У меня есть класс, который асинхронно использует HttpWebRequest внутри него и предоставляет такой интерфейс:

StartAsyncOperation(Action<TResult> onSuccess, Action<Exception> onError)

Какую прибыль я получу, если я перепишу этот класс, используя HttpWebRequest.GetResponseAsync помимо него, или я просто могу использовать TaskComplitionSource, как здесь Использование библиотеки параллельных задач в асинхронном шаблоне на основе событий, и это будет нормально?


person er-v    schedule 25.06.2013    source источник
comment
Использует ли ваш класс Begin*()/End*() (APM) или только пул потоков?   -  person SLaks    schedule 25.06.2013


Ответы (2)


Если предположить, что ваш StartAsyncOperation действительно использует асинхронные операции (например, BeginGetResponse/EndGetResponse), то его переписывание не принесет большой пользы.

Делать оболочку TaskCompletionSource пока нормально. В конце концов вы, вероятно, захотите переписать его для использования async, потому что через несколько лет шаблон onSuccess/onError будет выглядеть очень странно для разработчиков, привыкших к async.

person Stephen Cleary    schedule 25.06.2013

Если ваш код соответствует шаблону APM (BeginMethod/EndMethod), используйте TaskFactory.FromAsync. немедленно.

Я бы рекомендовал не использовать TaskFactory.FromAsync, а обернуть его в метод с суффиксом Async, реализация которого в будущем может быть заменена на async/await. Таким образом, вы можете реорганизовать свой код по мере необходимости, а не только ради async/await.

person Paulo Morgado    schedule 25.06.2013