Запустите асинхронный метод 8 раз параллельно

Как мне превратить следующее в 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();
    }
}

Я кодировал это в предположении, что асинхронная и параллельная обработка будут одинаковыми, и я просто понял, что это не так. Я посмотрел на все вопросы, которые я мог найти по этому вопросу, и я действительно не могу найти пример, который делает это для меня. У большинства из них отсутствуют читаемые имена переменных. Использование однобуквенных имен переменных, которые не объясняют, что они содержат, - ужасный способ привести пример.

У меня обычно есть от 300 до 2000 записей в массиве с именами нитей (содержит URL-адреса к темам форума), и кажется, что параллельная обработка (из-за большого количества HTTP-запросов) ускорит выполнение).

Должен ли я удалить всю асинхронность (у меня нет ничего асинхронного вне foreach, только определения переменных), прежде чем я смогу использовать Parallel.ForEach? Как мне это сделать? Могу ли я сделать это, не блокируя основной поток?

Я использую .NET 4.5, кстати.

Ответы на вопрос(4)

Ваш ответ на вопрос