繁体   English   中英

C#TPL锁定任务之间的共享对象,并使用Task(TResult)任务的结果填充它

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM