您可以强制Parallel.Invoke使用多线程?(Can you force Parallel.

2019-09-02 04:02发布

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

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

以前我是发射了每个调用一个线程,它是更加敏感,这是现在,当我使用Parallel.Invoke。

我应该承担的TPL库将做什么是最好的或者是有办法了那么它实际上在并行调用我来调整呢?

我猜它归结到我的网站上运行的硬件类型,我相信这是一个VM。

我的每一个电话,使一个HTTP请求来从一个API调用的结果。

Answer 1:

Parallel.Invoke将运行在平行的方法,除非这是比依次运行这些更昂贵,或有在threadpool.This没有可用线程是一种优化,不是一个问题。 在正常情况下,你不应该试图第二猜测的框架,就让它做它的工作。

您应该考虑重写此行为,如果您想调用一些长时间运行IO绑定的方法。 Parallel.Invoke使用默认的TaskScheduler作为有核(不知道有多少),以避免超载的CPU,它使用一样多线程。 这不是一个问题,如果你的行动只是等待一些IO或网络调用来完成。

可以指定使用Parallel.Invoke(ParallelOptions,操作[])]的最大线程数1所覆盖。 您也可以使用ParallelOptions类传递一个取消标记或specifiy定制的TaskScheduler,例如一个允许你使用多个线程比默认的调度。

你可以重写你这样的代码:

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

不过,你不应该试图修改默认选项,除非你找到一个实际的性能问题。 你可能最终超额认购你的CPU和造成延误或抖动。



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


文章来源: Can you force Parallel.Invoke to use multiple threads?