Является ли контроллер MVC Async, который вызывает WebResponse, все еще асинхронным? - PullRequest
2 голосов
/ 14 марта 2012

У нас есть большая библиотека, которая выполняет множество HTTP-вызовов, используя HttpWebRequest для получения данных.Переписать эту библиотеку для использования асинхронных вызовов с HTTPClient было бы неплохо.Итак, мне было интересно, смогу ли я создать асинхронные контроллеры, которые используют фабрику задач для вызова нашей библиотеки, и будут ли вызовы, которые в конечном итоге будут сделаны через WebClient, асинхронными или они все равно будут синхронизированы.Есть ли какие-либо проблемы / побочные эффекты, которые я мог бы вызвать, пытаясь смешать асинхронный файл со старым HttpWebRequest?

1 Ответ

6 голосов
/ 15 марта 2012

Если я понимаю, что вы предлагаете, ответ: нет, изменение служб, о которых клиент говорит, что они асинхронные, не помогло бы. Клиент по-прежнему блокирует поток ЦП, пока ввод-вывод находится на сервере, независимо от того, является ли сервер асинхронным или нет.

Нет причин переключаться с HttpWebRequest. Вы можете использовать TaskFactory::FromAsync в .NET 4.0 для вызова HttpWebRequest::BeginGetResponse. Это выглядит примерно так:

WebRequest myWebRequest = WebRequest.Create("http://www.stackoverflow.com");

Task<WebResponse> getResponseTask = Task<WebResponse>.Factory.FromAsync(
                                                myWebRequest.BeginGetResponse,
                                                myWebRequest.EndGetResponse,
                                                null);

getResponseTask.ContinueWith(getResponseAntecedent =>
{
   WebResponse webResponse = getResponseAntecedent.Result;

   Stream webResponseStream = webResponse.GetResponseStream();

   // read from stream async too... eventually dispose of it
});

В .NET 4.5 вы можете все еще продолжать использовать HttpWebRequest и использовать новый метод GetResponseAsync с новыми функциями await в C #, чтобы превратить жизнь в черту. намного проще:

WebRequest myWebRequest = WebRequest.Create("http://www.stackoverflow.com");

using(WebResponse webResponse = await myWebRequest.GetResponseAsync())
using(Stream webResponseStream = webResponse.GetResponseStream())
{
     // read from stream async, etc.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...