问题:有些类有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);
});
这种逻辑如何改进或是否会对性能产生影响?
答案 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());
也就是说,一般来说,您需要对应用程序进行概要分析,以了解它是否存在性能问题。