我尝试使用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最终为空。
答案 0 :(得分: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
。