2010-06-15 1 views
0

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

В каждом потоке я создаю экземпляр класса GetWebPage и вызываю метод Get из этого экземпляра. Этот метод очень прост и основан главным образом на коде из документации 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 - это услуга, которую я вызываю в Интернете, и буфер - это XML-вывод с сервера. Как я уже сказал, у меня есть несколько экземпляров этого класса/метода в нескольких потоках (от 10 до 12), а иногда буфер не принадлежит адресу url этой же темы, кроме как другой поток.

EDIT

Я добавил

System.Net.ServicePointManager.DefaultConnectionLimit = 25; 

и прямо сейчас программа работает без ошибок в течение некоторого времени.

+0

Вы должны называть 'ReadToEnd()' или использовать 'StringBuilder'. – SLaks

+0

Вы нашли решение? –

ответ

0

Ваш метод полностью потокобезопасен.

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