单个ASP.net请求的多个核心

时间:2015-11-05 16:28:54

标签: c# asp.net iis

我正在尝试创建一个WebApi方法,该方法运行一系列难以进一步优化的循环计算。

x.Items.AsParallel().ForAll(item =>
{
    item.RunCalcs();
});

当执行此代码时,通过查看服务器任务管理器,它似乎只会最大化单个处理器核心,同时保持其他核心不受影响。

根据我的阅读,asp.net将单个请求限制为一个处理器核心。由于这是一个总体请求很少的Intranet服务器,因此我不关心管理服务器资源。

有没有办法覆盖或解决此问题以使我的循环运行得更快?

1 个答案:

答案 0 :(得分:1)

ASP.Net可以以非常简洁的方式限制甚至用于TPL的线程数。只需创建一个TaskScheduler,它仅限于一个线程并在给定的TaskScheduler上启动ASP.Net请求。我敢打赌,他们会拥有这些有限的TaskScheuler,它会有意义......

那么当您调用TPL或PLINQ时,在处理ASP.Net请求的任务中会发生什么?

使用对Task.Start的调用或甚至更好的调度任务,以及TPL团队更优选的方式,Task.Factory.StartNew。

BUT,BUT,BUTT:),这些是在 TaskScheduler.Current 之上的调度任务,这是我们已经运行的有限的TaskScheduler!因此,无论您的计算机有多少核心,所有计划任务都将在有限的TaskScheduler上刻录。

另一方面,async / await操作似乎正在使用.Net 4.5+中引入的新Task.Run()并且有人建议,它是在TashScheduler.Default上调度任务,什么是ThreadPool本身,所以没有限制,除了核心数量。除了这个导致之外,我没有证据:Regarding usage of Task.Start() , Task.Run() and Task.Factory.StartNew() TPL

不幸的是,AsParallel()没有过载任务,而是使用TaskScheduler。

所以解决方案是:

  1. @S K已经建议的第一个,使用并行类并指定并行度。该类早于PLINQ,并且正在使用ThreadPool,因为它似乎合适。
  2. 第二个想法是自己安排在ThreadPool上。
  3. 或在TaskScheduler.Default上安排任务,目标是ThreadPool。
  4. 或者为ASP.Net产生自己的线程(最糟糕的主意)。
  5. 或使用async / await在TaskScheduler.Default上运行工作,ThreadPool和async方法使用AsParalel(),因为TaskScheduler.Current与TaskScheduler.Default相同,只是ThreadPool。
  6. 注意事项:请注意,在ASP.Net中调度ThreadPool上的重要内容会导致处理ASP.Net请求的性能下降......