2016-10-28 2 views
0

Я хочу сделать Parallel.ForEach (...) для сниппленного кода, однако, поскольку есть два вызова функций - оба должны произойти в том же блоке, что и второй funtion потребляет значение, возвращаемое первой функцией. Я не знаю, кому это удалось. В принципе, я хочу преобразовать нижеследующее в Parallel.ForEach (...). Заранее спасибо.Parallel.Foreach для вызова и использования нескольких функций

 List<Employee> employeeList = GetEmployees(); 

     foreach (var emp in employeeList) 
      { 
       var empDetails = GetEmpDetails(emp.EmployeeId); 

       ProcessEmployeeDetails(empDetails); 
      } 

Я уже пробовал ниже, он не работает:

  Parallel.ForEach(employeeList, emp => 
      { 
       var empDetails = GetEmpDetails(emp.EmployeeId); 

       ProcessEmployeeDetails(empDetails); 

      }); 
+0

Что не означает? что происходит? можете ли вы подробно описать «GetEmpDetails» и «ProcessEmployeeDetails»? –

+0

Вы изменяете какое-то общее состояние внутри одного из этих методов? Тогда проблема не в Parallel.ForEach, а в теоретической возможности запускать их параллельно. –

+0

GetEmpDetails (emp.EmployeeId) и ProcessEmployeeDetails (empDetails) не изменяют какое-либо общее состояние ... поэтому после того, как detials r вернутся из GetEmpDetails (emp.EmployeeId), ProcessEmployeeDetails (empDetails) принимает эти данные и продолжает работать, сохраняя данные в новую таблицу. – saklo

ответ

0

кажется, что вы используете EF соединение за кулисами, и это не кажется, предназначен для этого и выполняет множество данных поиск выполняется по одной и той же команде. Вы можете узнать больше об этом here. Там есть решение: включить MARS.

Так как я вижу, что проблема с Parallel.ForEach не возникает, но проблема с некоторыми базовыми элементами, которые невозможно запускать параллельно из коробки.

P.S. Чтобы быть более ясным: две функции внутри тела цикла будут работать в одном потоке.

+0

да ... Я использую Linq для Entity. Спасибо за вашу помощь. – saklo

+0

Нет проблем, попробуйте включить MARS или найти другие решения этой проблемы, если это не поможет. Вы также должны быть осторожны с тем, что вы делаете в параллельных потоках, чтобы гарантировать, что они не будут редактировать какой-либо незащищенный ресурс или использовать какую-либо другую библиотеку, которая не предназначена для поддержки многопоточности. –

+0

сделают это, спасибо за помощь. очень признателен. – saklo

Смежные вопросы