2010-06-04 39 views
8

我需要將大約200個HTTP請求並行發送到不同的服務器並獲得響應。 我在C#中使用HttpWebRequest類。 但是,當並行處理請求時,我看不到良好的時間增強。 例如,如果一個請求需要3秒獲得響應,2個請求並行 - 6秒,3個請求 - 8秒,4個請求 - 11秒... 這不好,我希望應該有最好的時間,大約10秒爲200個請求。 看起來好像只有2-3個請求並行執行,但超時在WebRequest對象創建後立即開始。 我試過設置DefaultConnectionLimitMaxServicePoints值,但是id沒有幫助。正如我理解這些參數的並行請求數量的一個網站。我需要請求到不同的網站。C#中的多個HTTP請求

ArrayList a = new ArrayList(150); 

for (i = 50; i < 250; i++) 
{ 
    a.Add("http://207.242.7." + i.ToString() + "/"); 
} 

for (i = 0; i < a.Count; i++) 
{ 
    Thread t = new Thread(new ParameterizedThreadStart(performRequest)); 
    t.Start(a[i]); 
} 


static void performRequest(object ip) 
{ 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create((stirng)ip); 

     HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 
} 

Сan有人曾經遇到這樣一個問題:

,我用它來測試代碼的例子嗎? 謝謝你的任何建議。

+0

我自己也有類似的問題,似乎WebRequest.Create()出於某種原因重用了相同的TCP連接。我想知道你的問題的答案是什麼? – ala 2011-10-19 01:20:35

回答

3

啓動你自己的線程,而不是嘗試使用的HttpWebRequest異步方法,如HttpWebRequest.BeginGetResponseHttpWebRequest.BeginGetRequestStream

+1

我已經有了多線程應用程序,需要在已創建的線程中執行這些請求。這只是示例代碼。要點是當線程執行WebRequest.Create和GetResponse操作時,porfomance非常慢。在HTTP請求之前,我在服務器的80端口上的相同線程中執行TCP連接,以知道端口是打開還是關閉,並且工作速度非常快。 – Nikita 2010-06-04 10:05:32

2

這可能會幫助 - http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1f863f20-09f9-49a5-8eee-17a89b591007

:建議有允許的TCP連接數的限制,但可以增加限制

+0

更多細節在這裏以及 - http://arnosoftwaredev.blogspot.com/2006/09/net-20-httpwebrequestkeepalive-and.html 這幾乎可以肯定你打的問題 – ChoccyButton 2010-06-04 10:05:34

+0

雖然..您的鏈接似乎引用同時連接到* one *主機,並從問題中的示例中,OP正在連接到幾個不同的主機......這是這種情況還是.NET的最大連接數限制爲* any *主持人呢? – Patrick 2010-06-04 10:56:13

+0

@Patrick認爲你有一點。取決於我猜想,如果所有200個請求都轉到不同的服務器上,或者說10到第一個服務器,20到下一個,5到下一個等等,這會造成問題。否則它可能不是問題。至少值得一試 – ChoccyButton 2010-06-04 11:38:17

0


你可以試試這個:

try 
     { 
      List<Uri> uris = new List<Uri>(); 
      uris.Add(new Uri("http://www.google.fr")); 
      uris.Add(new Uri("http://www.bing.com")); 

      Parallel.ForEach(uris, u => 
      { 
       WebRequest webR = HttpWebRequest.Create(u); 
       HttpWebResponse webResponse = webR.GetResponse() as HttpWebResponse; 
      }); 
     } 
     catch (AggregateException exc) 
     { 
      exc.InnerExceptions.ToList().ForEach(e => 
       { 
        Console.WriteLine(e.Message); 
       }); 
     } 
-2

這是android應用程序發送請求的代碼。我們如何使用上類似的代碼 params.add(新BasicNameValuePair( 「鍵」, 「值」);

HttpPost請求=新HttpPost();

列表PARAMS =新的ArrayList();

params.add(新BasicNameValuePair( 「鍵」, 「值」); //我們怎能捨棄值以這種格式格式

post.setEntity(新UrlEncodedFormEntity(PARAMS));

httpClient.execute(請求);