并行性改进

时间:2014-10-01 14:47:20

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

是否有更好的并行模式可以在以下代码中得到改进?使用C#中的所有新任务功能,我想知道是否还有改进的余地。对TaskManager.StartNew的调用是Task.Factory.StartNew的包装器,带有异常处理。它基本上创建了一个Tasks数组,然后调用WaitAll方法。这是并行执行这些任务的最佳方式吗?

 var queries = new Task[]
        {
            TaskManager.StartNew(() =>
                {
                   ...
                }, context.UserContextContainer.UserContext),
            TaskManager.StartNew(() =>
                {
                    ...
                }, context.UserContextContainer.UserContext),
            TaskManager.StartNew(() =>
                {
                   ...
                }, context.UserContextContainer.UserContext),
            TaskManager.StartNew(() =>
                {
                   ...
                }, context.UserContextContainer.UserContext),
            TaskManager.StartNew(() =>
                {
                   ...
                }, context.UserContextContainer.UserContext)
        };


  Task.WaitAll(queries);

1 个答案:

答案 0 :(得分:0)

这取决于每项任务的运行情况。如果这些任务是cpu绑定的(例如重型计算),那么你可以使用这段代码。但是,如果这些任务受I / O限制(如Web服务调用,数据库调用,文件操作),那么最好以异步/等待方式设计它。这样你就不会阻止你拥有的所有内核。

如果你有4个内核并且可以说8个任务,实际上你的代码完成了4个4的作业。当你用async / await模式重写它时,所有任务都将并行运行。但是,如果你的任务是cpu绑定的,你也不需要这样做。