Parallel.Foreach и параллельное выполнение в C # - PullRequest
4 голосов
/ 14 февраля 2011

У меня есть задача сканирования всех имен папок, начинающихся с "xyz" параллельно.Я имел в виду, что если одна папка сканируется одновременно, другая тоже должна сканироваться.Я не хочу сканирование по одному.

Для этого я использовал Parallel Foreach.

Вопрос в том, что?Это правильно или нет?и Как узнать, что он работает параллельно (чтобы поместить какое-либо сообщение куда-нибудь)?

Parallel.ForEach(path, currentPath =>
   {
    var output = programReader.GetData(currentPath, durReader.dirPattern);

    foreach (var item in output)
      {
        foreach (var project in item.Name)
           Console.WriteLine(item.serverName + " " + item.serverNumber + " " + fileName);
        }
     }

РЕДАКТИРОВАТЬ:

Является ли Parallel.Foreach работает только на многоядерных системахон может работать на одноядерной системе также для показа параллелизма

Ответы [ 4 ]

3 голосов
/ 14 февраля 2011

Foirst - если вы задаете вопрос, задайте его.!!это хороший признак, это не вопрос.

Во-вторых, ваш подход не имеет большого смысла.Параллель будет идти ОЧЕНЬ параллельно.Хорошо.Плохо: у тебя все еще есть только один диск.Результат: задачи ожидают.Нет смысла паралеллизировать операции ввода-вывода в степени, поддерживаемой аппаратными средствами.

1 голос
/ 14 февраля 2011

Параллельные расширения распределяют нагрузку на ядро ​​- хотя я не уверен, что они учитывают гиперпоточные ядра.

Но, чтобы добавить другой ответ, чтобы направить вас в правильном направлении:

Не пытайтесь делать это параллельно.Диск может обслуживать только один запрос за раз, поэтому вы, скорее всего, просто все замедляете, так как очередь диска, скорее всего, увеличивается.

Единственный сценарий, в котором вы можете повысить производительностьесли сканируемое местоположение на самом деле является SAN, где хранилище распределено и сильно реплицировано.

0 голосов
/ 14 февраля 2011

Parallel.ForEach или Parallel.Execute использует ядра процессора.Так что если ваш процессор имеет более одного ядра, они будут одинаково использоваться для запуска этого потока.Вот ты, м

0 голосов
/ 14 февраля 2011

Вы можете напечатать значение Thread.ManagedThreadId, чтобы увидеть, какие потоки используются.

...