2016-07-25 70 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); } }); 

此代码未设置列表,allResults最终为空。

+3

您不会从'Concat'调用保存值。可能,你的意思是使用“AddRange”。 – PetSerAl

+0

谢谢,那是问题所在。在设置Parallel.Invoke之前,我使用了一系列按照预期工作的连接 – mrb398

回答

0

正如已经PetSerAl在评论解释,Concat()不修改列表,它回报修改的列表。使用AddRange()代替Concat()是一个解决方案,但我想用Task s低于Parallel.Invoke()这里更清晰:

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

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

这样一来,就没有必要进行明确的锁定,这使得代码更安全。

如果可以,还可以使用await而不是.Result