Führen Sie die asynchrone Methode 8 Mal parallel aus
Wie mache ich Folgendes zu einem 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();
}
}
Ich habe es in der Annahme codiert, dass die asynchrone und die parallele Verarbeitung gleich sind, und mir ist nur klar geworden, dass dies nicht der Fall ist. Ich habe mir alle Fragen angeschaut, die ich dazu finden konnte, und ich kann wirklich kein Beispiel finden, das es für mich macht. Den meisten von ihnen fehlen lesbare Variablennamen. Die Verwendung von einbuchstabigen Variablennamen, die nicht erklären, was sie enthalten, ist eine schreckliche Möglichkeit, ein Beispiel anzugeben.
Normalerweise habe ich zwischen 300 und 2000 Einträge im Array mit dem Namen threads (Enthält URLs zu Forenthreads) und es scheint, dass die parallele Verarbeitung (aufgrund der vielen HTTP-Anforderungen) die Ausführung beschleunigen würde.
Muss ich die gesamte Asynchronität entfernen (ich habe nichts Asynchrones außerhalb von foreach, nur Variablendefinitionen), bevor ich Parallel.ForEach verwenden kann? Wie soll ich das machen? Kann ich das tun, ohne den Haupt-Thread zu blockieren?
Ich benutze übrigens .NET 4.5.