[英]C# TPL lock shared object between tasks vs populating it with the results from Task(TResult) tasks
在我使用.net 4.0中的任务并行库时,我想知道什么是从我的并行任务合并结果的最佳方法,通常我需要锁定它们之间的共享对象,但现在我想知道是否Task(TResult)
类和合并到底是一个更好的解决方案? 下面我考虑两种方法:
带锁的TPL:
public MyObject DoWork()
{
var result = new MyObject();
var resultLock = new object();
var taskArray = new Task[this._objects.Length];
for (var i = 0; i < taskArray.Length; i++)
{
taskArray[i] = new Task((obj) =>
{
var _o = obj as AnObject;
var tmpResult = _o.DoTaskWork();
lock (resultLock)
result.Add(tmpResult);
}, this._objects[i]);
}
Task.WaitAll(taskArray);
return result;
}
和TPL最后合并:
public MyObject DoWork()
{
var taskArray = new Task<String>[this._objects.Length];
for (var i = 0; i < taskArray.Length; i++)
{
taskArray[i] = new Task<String>((obj) =>
{
var _o = obj as AnObject;
return _o.DoTaskWork();
}, this._objects[i]);
}
Task<String>.WaitAll(taskArray);
var result = new MyObject();
for (var i = 0; i < taskArray.Length; i++)
result.Add(taskArray[i].Result);
return result;
}
是否有正确或错误的解决方案或什么是最佳实践(非常欢迎其他可能的解决方案来合并并行任务的结果)
使用Parallel LINQ(它为你做了所有令人讨厌的事情),你可以把它煮成一行左右:
var workResults = _objects.AsParallel().Select(DoTaskWork);
foreach(var r in workResults)
{
result.Add(r);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.