.сеть. Максимальное количество асинхронных HttpWebRequest - PullRequest
1 голос
/ 10 декабря 2011

Мне нужно обрабатывать параллельные запросы в моем приложении. Я использую этот код:

public class AsyncHttpHelper
{
public static IEnumerable<XDocument> GetPagesAsXDocuments(IEnumerable<string> uris)
{
    IEnumerable<IAsyncResult> asyncResults = uris
        .Select(uri => (HttpWebRequest)WebRequest.Create(uri))
        .Select(webRequest => webRequest.BeginGetResponse(null, webRequest));

    WaitHandle[] handles = asyncResults.Select(asyncResult => asyncResult.AsyncWaitHandle).ToArray();
    WaitHandle.WaitAll(handles);
    var result = asyncResults
        .Select(asyncResult =>
        {
            var httpWebRequest = (HttpWebRequest)asyncResult.AsyncState;
            HttpWebResponse response;
            try
            {
                response = (HttpWebResponse)httpWebRequest.EndGetResponse(asyncResult);
            }
            catch (Exception ex)
            {
                return null;
            }
            Stream responseStream = response.GetResponseStream();
            if (responseStream == null)
            {
                return null;
            }
            using (var streamReader = new StreamReader(responseStream))
            {
                return XDocument.Load(streamReader);
            }

        });
    return result;
}

}

Но это правильно работает только с 1 URL для запроса. Когда я пытаюсь получить 2 или более URL, мой метод зависает. Когда я делаю паузу, отладчик показывает мне выполнение WaitHandle.WaitAll(handles); этой строки. Итак, я вижу, что не все асинхронные запросы были выполнены.

Так в чем проблема. Почему я не могу сделать несколько запросов async

Спасибо, Андрей

Ответы [ 2 ]

3 голосов
/ 10 декабря 2011

Возможно, проблема в том, что ограничение по умолчанию для менеджера точки обслуживания слишком низкое.

(@ mfeingold: это настройка, которую вы имеете в виду? Я думаю, что по умолчанию она равна 2) попробуйте установить свойство:

System.Net.ServicePointManager.DefaultConnectionLimit

до чего-то более высокого, прежде чем создавать HttpWebRequest.

2 голосов
/ 10 декабря 2011

Не помню, чтобы у меня не получалось, но в файле web.config была настройка, указывающая количество одновременных исходящих веб-запросов. Насколько я помню, значение по умолчанию для числа было действительно низким, я считаю, что это было 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...