使用列表和Parallel.Invoke

时间:2016-07-25 00:10:52

标签: c# .net parallel-processing task-parallel-library

我尝试使用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最终为空。

1 个答案:

答案 0 :(得分:0)

正如PetSerAl在评论中已经解释的那样,Concat()不修改列表,返回修改后的列表。使用AddRange()代替Concat()是一种解决方案,但我认为使用TaskParallel.Invoke()更清晰:

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

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

这样,就不需要显式锁定,这使得代码更安全。

如果可以,您也可以使用await代替.Result