你能强迫平行吗?调用以使用多个线程

本文关键字:线程 调用 | 更新日期: 2023-09-27 18:12:23

我在。aspx页面中使用这样的任务并行库:

 Parallel.Invoke(
                new Action[]
                    {
                        () => { users= service.DoAbc(); },
                        () => { products= service.DoDef(); }
                    });

以前我每次调用都触发一个线程,现在当我使用Parallel.Invoke时,响应速度更快。

我应该假设TPL库将做什么是最好的,或者有一种方法让我调整它,使它实际上并行调用?

我想这是因为我的网站运行的硬件类型,我认为是虚拟机。

我的每个调用都发出一个http请求来从API调用中获取结果。

你能强迫平行吗?调用以使用多个线程

平行。Invoke将并行地运行您的方法,除非这样做比按顺序运行它们更昂贵,或者线程池中没有可用的线程。这是一种优化,而不是问题。在正常情况下,你不应该试图猜测框架,只是让它做它的工作。

如果您想调用一些长时间运行的io绑定方法,您应该考虑重写此行为。平行的。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,并导致延迟或抖动。

您可以启动几个任务来处理调用。

// 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;