2016-07-25 2 views
0

Я пытаюсь запустить методы с использованием Parallel.Invoke, с каждым методом добавляющего ответ на список за пределами Parallel.InvokeРабота со списками и Parallel.Invoke

Я играл вокруг с помощью замка, но следующий код не работает

var allResults = new List<ResultRecord>(); 
var sync = new object(); 

Parallel.Invoke(
    () => { var results = GetResultSet1(); lock (sync) { allResults.Concat(results); } }, 
    () => { var results = GetResultSet2(); lock (sync) { allResults.Concat(results); } }); 

Этот код не устанавливает список, все результаты заканчиваются пустым.

+3

Вы не сохраняете значение из 'Concat'. Возможно, вы хотите использовать 'AddRange'. – PetSerAl

+0

Спасибо, в этом была проблема. Перед настройкой Parallel.Invoke я использовал строку concats, которая работала как ожидалось – mrb398

ответ

0

Как уже объяснил PetSerAl в комментарии, Concat() не изменяет список, это возвращает измененный список. Использование AddRange() вместо Concat() этого решения, но я думаю, что с помощью Task сек яснее, чем Parallel.Invoke() здесь:

var resultSet1Task = Task.Run(() => GetResultSet1()); 
var resultSet2Task = Task.Run(() => GetResultSet2()); 

List<ResultRecord> allResults = resultSet1Task.Result.Concat(resultSet2Task.Result).ToList(); 

Таким образом, нет необходимости в явную блокировку, что делает код более безопасным.

Если вы можете, вы также можете использовать await вместо .Result.

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