Task.Factory和Process.Parallel

时间:2015-08-10 10:06:48

标签: task-parallel-library

问题:有些类有M方法,M方法通过Task.Factory调用M1和M2方法逻辑。

M方法逻辑代码:

Task.Factory.StartNew(() => ProcessAndSendResultAsync(ConfigKey, content));

Task.Factory.StartNew(() => ProcessProcessorsInParalle(ConfigKey, content)); 

M1方法逻辑:      已经通过M方法的taskfactory调用了M1方法,并且M1方法具有一些处理逻辑。

M2方法逻辑:      M2方法已经通过来自M方法的taskfactory和Somewhere Created Mulitple处理器(在C#逻辑中)调用,并且在m2方法中使用parallel.foreach在parllel中调用处理器。

Parallel.ForEach(processes, (p) =>
{
    p.Process(content, configkey);
});

这种逻辑如何改进或是否会对性能产生影响?

1 个答案:

答案 0 :(得分:0)

执行ProcessProcessorsInParalle时执行Parallel.ForEach的线程池线程被阻塞,实际上是在浪费该线程。一个小的优化是在TPL任务中运行每个Process的调用。

var processTasks = processes.Select(
  p => Task.Factory.StartNew(() => p.Process(content, configkey))).ToList();

如果您需要在Process调用完成后执行进一步处理,则可以将ProcessProcessorsInParalle的其余部分移动到单独的方法中并将其作为continuation调用。

Task.Factory.ContinueWhenAll(processTasks, t => FinishProcessInParallel());

也就是说,一般来说,您需要对应用程序进行概要分析,以了解它是否存在性能问题。