2016-12-06 131 views
-4

使用此代碼〜5-10秒是正常的下載20頁html代碼?或者我該如何更快地做到這一點?C#Web客戶端性能

的網址是:https://www.g2a.com/

URL []是包含從DataGridView列網址:

https://www.g2a.com/marketplace/product/ 。 。 。

using (WebClient client = new WebClient()) 
{ 
    for (int i = 0; i < dataGridView1.Rows.Count; i++) 
    { 
     code[i] = client.DownloadString(url[i]); 
    } 
} 
+0

使用套接字,您可以並行執行此操作。 –

+5

這就好比問20mph是否是「正常」速度。對於毛蟲?不,它太快了。對於飛機?不,它太慢了。對於一輛車?也許,這取決於交通... –

+0

我依賴於你的網址。 – selami

回答

2

你顯然不能加快每個單一的下載,但你可以下載幾個URL的內容並行。有很多方法可以做到這一點,這裏是一個使用Parallel.ForEach

var urls = new List<string>() { "http://www.google.com", "http://www.stackoverflow.com" }; 
var results = new ConcurrentDictionary<string, string>(); 

Parallel.ForEach(urls, url => 
{ 
    using (var webClient = new WebClient()) 
    { 
     results[url] = webClient.DownloadString(url); 
    } 
}); 

結果存儲在ConcurrentDictionary與URL爲重點,因此該循環完成後,就可以解壓下載的代碼。您可能需要添加一些代碼來引入錯誤處理,並可能會添加一些合理的超時,但我希望這會給您一個想法。

0

如果您從20個不同的URL中獲取數據,並且如果這些調用都不依賴於其他URL,那麼爲什麼要在循環中執行?爲什麼不使用20個不同的Web客戶端製作20個不同的asynchronous calls?然後,當他們全部完成時,您可以將結果拼接在一起。

喜歡的東西:

// Start the HandleFile method. 
Task<string> task1 = ScrapeUrl(url1); 
Task<string> task2 = ScrapeUrl(url2); 
Task<string> task3 = ScrapeUrl(url3); 
... 


// Control returns here before scraping is done. 

Console.WriteLine("Please wait patiently..."); 

// Wait for the scraping tasks to complete. 
// ... Display its results. 
string result1 = await task1; 
string result2 = await task2; 
string result3 = await task3; 
... 
+1

或者20個請求帶有一個'HttpClient' – ColinM

+0

I' d建議'Task.WaitAll(task1,task2,...)',否則所有任務將按順序執行。 – fknx

1

要發佈另一個選項,如答案已到目前爲止,這裏的一個版本只使用方法中的HttpClient的一個實例,基本上可以拆分20個作業並從這些作業的URL中獲取HTML內容,一旦工作開始,你就可以等待這些工作完成。

我之所以發佈這個以及其他答案的原因是因爲如果您使用HTTP客戶端,則不需要每個URL的多個客戶端實例。

private async Task GetAuctionData() 
{ 
    List<Task> tasks = new List<Task>(); 
    using (var client = new HttpClient()) 
    { 
     for (int i = 0; i < dataGridView1.Rows.Count; i++) 
     { 
      var downloadTask = Task.Run(() => 
       { 
        // Perform work here on HttpClient 
       }); 
      tasks.Add(downloadTask); 
     } 

     await Task.WhenAll(tasks); 
    } 
}