我在.aspx页面中使用这样的任务并行库:
Parallel.Invoke(
new Action[]
{
() => { users= service.DoAbc(); },
() => { products= service.DoDef(); }
});
以前我每次调用时都会触发一个线程,而且当我使用Parallel.Invoke时它现在响应更快。
我是否应该假设TPL库会做最好的事情,或者有没有办法让我调整它以便它实际上并行调用?
我想这取决于我的网站运行的硬件类型,我相信它是一个虚拟机。
我的每个调用都会发出一个http请求来从API调用中获取结果。
答案 0 :(得分:4)
Parallel.Invoke将并行运行方法,除非这比顺序运行它们更昂贵,或者线程池中没有可用的线程。这是一个优化,而不是问题。在正常情况下,你不应该试图猜测框架并让它完成它的工作。
如果要调用一些长时间运行的IO绑定方法,则应考虑重写此行为。 Parallel.Invoke使用默认的TaskScheduler,它使用与核心一样多的线程(不知道有多少)来避免CPU过载。如果您的操作只是等待某个IO或网络调用完成,则这不是问题。
您可以使用Parallel.Invoke(ParallelOptions,Action [])] 1覆盖指定最大线程数。您还可以使用ParallelOptions类传递取消令牌或指定自定义TaskScheduler,例如允许您使用比默认调度程序更多的线程。
您可以像这样重写代码:
Parallel.Invoke(
new ParallelOptions{MaxDegreeOfParallelism=30},
new Action[]
{
() => { users= service.DoAbc(); },
() => { products= service.DoDef(); }
});
但是,除非发现实际的性能问题,否则不应尝试修改默认选项。您可能最终超额订购CPU并导致延迟或颠簸。
答案 1 :(得分:2)
您可以启动一些任务来处理呼叫。
// Change to Task.Factory.StartNew depending on .NET version
var userTask = Task.Run(() => service.DoAbc());
var productsTask = Task.Run(() => service.DoDef());
Task.WaitAll(userTask, productsTask);
users = userTask.Result;
products = productsTask.Result;