簡體   English   中英

在多個線程中使用時,HttpWebResponse變得混亂

[英]HttpWebResponse get mixed up when used inside multiple threads

在我的應用程序中,我有幾個線程將從Web服務獲取數據。 基本上,我只是打開一個URL並獲取XML輸出。 我有幾個線程使用不同的URL連續執行此操作。 有時結果混合起來。 XML輸出不屬於線程的URL,而是屬於另一個線程的URL。

在每個線程中,我創建類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是我在Internet上調用的服務, 緩沖區是服務器的XML輸出。 就像我說的那樣,我在幾個線程(10到12)中有該類/方法的多個實例,有時緩沖區不屬於同一線程的URL ,而是屬於另一個線程。

編輯

我加了

System.Net.ServicePointManager.DefaultConnectionLimit = 25;

現在,它的程序在相當長一段時間內都沒有錯誤地工作。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM