Uruchom metodę asynchroniczną 8 razy równolegle

Jak zamienić poniższe w 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();
    }
}

Zakodowałem go przy założeniu, że przetwarzanie asynchroniczne i równoległe będzie takie samo, a ja po prostu zrozumiałem, że tak nie jest. Przyjrzałem się wszystkim pytaniom, które mogłem znaleźć na ten temat i naprawdę nie mogę znaleźć przykładu, który by to dla mnie zrobił. Większość z nich nie ma czytelnych nazw zmiennych. Używanie jednoznakowych nazw zmiennych, które nie wyjaśniają, co zawierają, jest okropnym sposobem na podanie przykładu.

Zwykle mam od 300 do 2000 wpisów w tablicy o nazwie thread (Zawiera adresy URL do wątków forum) i wydaje się, że przetwarzanie równoległe (ze względu na wiele żądań HTTP) przyspieszy wykonanie).

Czy muszę usunąć całą asynchronię (nie mam nic asynchronicznego poza foreach, tylko definicje zmiennych), zanim będę mógł użyć Parallel.ForEach? Jak mam to zrobić? Czy mogę to zrobić bez blokowania głównego wątku?

Przy okazji używam .NET 4.5.

questionAnswers(4)

yourAnswerToTheQuestion