我在 .aspx 页面中使用这样的任务并行库:
Parallel.Invoke(
new Action[]
{
() => { users= service.DoAbc(); },
() => { products= service.DoDef(); }
});
以前,我每次调用都会触发一个线程,并且比现在使用 Parallel.Invoke 时的响应速度更快。
我应该假设 TPL 库会做最好的事情,还是有办法让我调整它,以便它实际上并行调用?
我想这取决于我的网站运行的硬件类型,我认为它是虚拟机。
我的每个调用都会发出一个 http 请求来从 API 调用中获取结果。
Parallel.Invoke 将并行运行您的方法,除非这比顺序运行它们更昂贵,或者线程池中没有可用的线程。这是一种优化,而不是问题。在正常情况下,您不应该尝试对框架进行事后猜测,而应该让它完成其工作。
如果您想调用一些长时间运行的 IO 绑定方法,您应该考虑覆盖此行为。 Parallel.Invoke 使用默认的 TaskScheduler,它使用与核心数量相同的线程(不确定有多少个)以避免 CPU 过载。如果您的操作只是等待某些 IO 或网络调用完成,那么这不是问题。
您可以使用 Parallel.Invoke(ParallelOptions,Action[])] 指定最大线程数1覆盖。您还可以使用并行选项类来传递取消令牌或指定自定义任务计划程序,例如允许您使用比默认计划程序更多的线程。
您可以像这样重写您的代码:
Parallel.Invoke(
new ParallelOptions{MaxDegreeOfParallelism=30},
new Action[]
{
() => { users= service.DoAbc(); },
() => { products= service.DoDef(); }
});
不过,除非发现实际的性能问题,否则不应尝试修改默认选项。您最终可能会过度使用 CPU 并导致延迟或抖动。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)