100 個の URL のリストがあります。これらの URL の html コンテンツを取得する必要があります。の非同期バージョンを使用せずDownloadString
、代わりに次のことを行うとしましょう。
var task1 = SyTask.Factory.StartNew(() => new WebClient().DownloadString("url1"));
私が達成したいのは、一度に最大 4 つの URL の html 文字列を取得することです。
最初の 4 つの URL に対して 4 つのタスクを開始します。2 番目の URL が完了したと仮定すると、5 番目の URL の 5 番目のタスクをすぐに開始したいと考えています。等々。この方法では、最大 4 で 4 つの URL のみがダウンロードされ、100 個すべてが処理されるまで、常に 4 つの URL がダウンロードされます。
実際にこれをどのように達成するかを視覚化できないようです。これを行うための確立されたパターンが必要です。考え?
編集:
@Damien_The_Unbeliever のコメント to use をフォローアップしてParallel.ForEach
、次のように書きました。
var urls = new List<string>();
var results = new Dictionary<string, string>();
var lockObj = new object();
Parallel.ForEach(urls,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
url =>
{
var str = new WebClient().DownloadString(url);
lock (lockObj)
{
results[url] = str;
}
});
上記は、個々のタスクを作成し、セマフォを使用して同時実行を制限するよりも読みやすいと思います。を使用したり、使用したりしたことがないためParallel.ForEach
、これが必要なことを正しく行うかどうかはわかりません。