以下をParallel.ForEachに変換するにはどうすればよいですか?
public async void getThreadContents(String[] threads)
{
HttpClient client = new HttpClient();
List<String> usernames = new List<String>();
int i = 0;
foreach (String url in threads)
{
i++;
progressLabel.Text = "Scanning thread " + i.ToString() + "/" + threads.Count<String>();
HttpResponseMessage response = await client.GetAsync(url);
String content = await response.Content.ReadAsStringAsync();
String user;
Predicate<String> userPredicate;
foreach (Match match in regex.Matches(content))
{
user = match.Groups[1].ToString();
userPredicate = (String x) => x == user;
if (usernames.Find(userPredicate) != user)
{
usernames.Add(match.Groups[1].ToString());
}
}
progressBar1.PerformStep();
}
}
非同期処理と並列処理は同じであると想定してコーディングしましたが、そうではないことに気づきました。私はこれについて見つけることができるすべての質問を調べました、そして私は本当に私のためにそれをする例を見つけることができないようです。それらのほとんどは、読み取り可能な変数名を欠いています。何が含まれているのかを説明していない1文字の変数名を使用することは、例を述べるための恐ろしい方法です。
私は通常、threads(フォーラムスレッドへのURLを含む)という名前の配列に300から2000のエントリを持っており、並列処理(多くのHTTPリクエストのため)が実行を高速化するように見えます)。
Parallel.ForEachを使用する前に、すべての非同期を削除する必要がありますか(foreachの外部では非同期はなく、変数定義のみ)?どうすればこれを行うことができますか?メインスレッドをブロックせずにこれを行うことはできますか?
ちなみに私は.NET4.5を使用しています。