HttpWebResponse перепутывается при использовании внутри нескольких потоков - PullRequest
0 голосов
/ 15 июня 2010

В моем приложении у меня есть несколько потоков, которые будут получать данные из веб-службы. В основном я просто открываю URL и получаю вывод XML. У меня есть несколько потоков, которые делают это постоянно, но с разными URL. Иногда результаты перепутаны. Вывод XML принадлежит не URL-адресу потока, а URL-адресу другого потока.

В каждом потоке я создаю экземпляр класса GetWebPage и вызываю метод Get from this instance. Метод очень прост и основан в основном на коде из документации MSDN. (См. Ниже. Я удалил свою обработку ошибок здесь!)

    public string Get(string userAgent, string url, string user, string pass, int timeout, int readwriteTimeout, WebHeaderCollection whc)
    {
        string buffer = string.Empty;
        HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create(url);

        if (!string.IsNullOrEmpty(userAgent))
            myWebRequest.UserAgent = userAgent;

        myWebRequest.Timeout = timeout;
        myWebRequest.ReadWriteTimeout = readwriteTimeout;

        myWebRequest.Credentials = new NetworkCredential(user, pass);
        string[] headers = whc.AllKeys;

        foreach (string s in headers)
        {
            myWebRequest.Headers.Add(s, whc.Get(s));
        }

        using (HttpWebResponse myWebResponse = (HttpWebResponse)myWebRequest.GetResponse())
        {
            using (Stream ReceiveStream = myWebResponse.GetResponseStream())
            {
                Encoding encode = Encoding.GetEncoding("utf-8");
                StreamReader readStream = new StreamReader(ReceiveStream, encode);
                // Read 1024 characters at a time.
                Char[] read = new Char[1024];

                int count = readStream.Read(read, 0, 1024);

                int break_counter = 0;
                while (count > 0 && break_counter < 10000)
                {
                    String str = new String(read, 0, count);
                    buffer += str;
                    count = readStream.Read(read, 0, 1024);
                    break_counter++;
                }
            }
        }
        return buffer;

Как видите, у меня нет общедоступных свойств или других общих ресурсов. По крайней мере, я не вижу никого. url - это служба, которую я вызываю в Интернете, а buffer - это вывод XML с сервера. Как я уже сказал, у меня есть несколько экземпляров этого класса / метода в нескольких потоках (от 10 до 12), и иногда buffer не принадлежит url того же потока, но другого потока.

EDIT

Я добавил

System.Net.ServicePointManager.DefaultConnectionLimit = 25;

и сейчас она довольно долго работает без ошибок.

1 Ответ

0 голосов
/ 15 июня 2010

Ваш метод полностью ориентирован на многопоточность.

Возможно, у вас проблема с кодом, вызывающим метод.

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