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