2010-06-15 81 views
0

在我的應用程序中,我有幾個線程將從Web服務中獲取數據。基本上我只是打開一個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

編輯

我加

System.Net.ServicePointManager.DefaultConnectionLimit = 25; 

和現在它PROGRAMM沒有錯誤的作品相當長的一段時間。

+0

您應該調用'ReadToEnd()'或使用'StringBuilder'。 – SLaks 2010-06-15 13:17:20

+0

您是否找到解決方案? – 2017-10-19 22:25:07

回答

0

你的方法完全是線程安全的。

您可能在調用該方法的代碼中存在問題。