2016-06-18 3 views
0

私は約100,000〜200,0000のURLのリストを入力すると、htmlをダウンロードして相対フォルダに保存する必要がある小さなアプリケーションを構築しようとしています。 。WebクライアントをForeachループで使用してWebページをダウンロードする約100,000

私は2つの解決策を持っていますが、それぞれが私が最良のアプローチを見つけようとしているいくつかの問題があります。

最初の解決策:以下の同期方法

は、私は、コードが正常に動作しますが、それは遅いですし、また、ランダムに5000の後に、それは停止が働いているURLとプロセスは、それが完了したと言う

currentline = 0; 
       var lines = txtUrls.Lines.Where(line => !String.IsNullOrWhiteSpace(line)).Count(); 
       string urltext = txtUrls.Text; 
       List<string> list = new List<string>(
          txtUrls.Text.Split(new string[] { "\r\n" }, 
          StringSplitOptions.RemoveEmptyEntries)); 

       lblStatus.Text = "Working"; 
       btnStart.Enabled = false; 

       foreach (string url in list) 
       { 
        using (WebClient client = new WebClient()) 
        { 
         client.DownloadFile(url, @".\pages\page" + currentline + ".html"); 
         currentline++; 
        } 
       } 

       lblStatus.Text = "Finished"; 
       btnStart.Enabled = true; 

を使用していたコードです。 (私は、バックグラウンドワーカーにこのコードを使用しています注意してくださいしかし、私は唯一の関連するコードを示しています表示するには、このコードを単純にしてください。)

第2の解決策は:Asynchronize方法は

int currentline = 0; 

       string urltext = txtUrls.Text; 
       List<string> list = new List<string>(
          txtUrls.Text.Split(new string[] { "\r\n" }, 
          StringSplitOptions.RemoveEmptyEntries)); 

       foreach (var url in list) 
       { 
        using (WebClient webClient = new WebClient()) 
        { 
         webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
         webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 
         webClient.DownloadFileAsync(new Uri(url), @".\pages\page" + currentline + ".html"); 
        } 

        currentline++; 
        label1.Text = "No.of Lines Completed: " + currentline; 
       } 

このコードでは、超高速動作しますが、ほとんどの私は0KBのファイルをダウンロードしていますが、OVH Dediサーバーでテストしているので、ネットワークが高速であると確信しています。

誰かが間違っていることを指摘できますか?それを改善するためのヒント、あるいはこの問題に対する全く別の解決策があります。代わりにDownloadFileを使用しての

+0

スレッドまたはタスクを分離するために、最初の解決方法をダウンロードするページをダウンロードしてみてください。あなたが主な作業スレッドでダウンロードすると、uiはリフレッシュされず、アプリケーションは応答しません。 2番目の方法では、非同期的なアプローチを試みます。方法は2通りあります。 beginメソッドとendメソッド、またはasyncで終わるメソッドを使用します。 BeginとEndメソッドはより古い非同期表現であり、 'async'という単語で終わるメソッドはキーワードasync awaitで使用するためのものです。あなたの孤独は、これら2つの方法を一緒にミックスします。 –

答えて

0

()を使用すると、[]バイトでフォーマットされたデータを取得します

public async Task GetData() 
{ 
     WebClient client = new WebClient(); 
     var data = await client.DownloadDataTaskAsync("http://xxxxxxxxxxxxxxxxxxxxx"); 
} 

使用してみてください。それから、ディスクに保存するには File.WriteAllBytes()を呼び出します。

関連する問題