2016-12-06 3 views
-4

このコードでは、20ページのHTMLコードをダウンロードするには5秒〜10秒の間は正常ですか?または、どうすれば速くできますか?C#Webclientのパフォーマンス

ウェブサイトは次のとおりです。

https://www.g2a.com/marketplace/product/ :[]でhttps://www.g2a.com/

urlはDataGridViewの列からURLが含まれています。 。 。

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

ソケットを使用すると、これを並行して実行できます。 –

+5

これは、20mphが「通常の」速度かどうかを確認するのと同じです。キャタピラのために?いいえ、あまりにも速いです。飛行機の場合?いいえ、あまりにも遅いです。車のために?たぶん、トラフィックに応じて... –

+0

あなたのURLによって異なります。 – selami

答えて

2

あなたは明らか各1回のダウンロードを高速化することはできませんが、並行して、いくつかの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); 
    } 
}); 

結果は、キーとしてURLとConcurrentDictionaryに格納されています。おそらく、エラー処理を導入するためのコードをいくつか追加して、妥当なタイムアウトを追加する必要がありますが、これでアイデアが得られることを願っています。

0

20種類の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

または、 'HttpClient'を含む20個のリクエスト – ColinM

+0

I ' dは 'Task.WaitAll(task1、task2、...)'を示唆します。そうでなければ、すべてのタスクが順番に実行されます。 – fknx

1

asyncメソッドでHttpClientのインスタンスを1つしか使用しない別のオプションを投稿するには、基本的に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); 
    } 
} 
関連する問題