我正在尝试创建一个WebApi方法,该方法运行一系列难以进一步优化的循环计算。
x.Items.AsParallel().ForAll(item =>
{
item.RunCalcs();
});
当执行此代码时,通过查看服务器任务管理器,它似乎只会最大化单个处理器核心,同时保持其他核心不受影响。
根据我的阅读,asp.net将单个请求限制为一个处理器核心。由于这是一个总体请求很少的Intranet服务器,因此我不关心管理服务器资源。
有没有办法覆盖或解决此问题以使我的循环运行得更快?
答案 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。
所以解决方案是:
注意事项:请注意,在ASP.Net中调度ThreadPool上的重要内容会导致处理ASP.Net请求的性能下降......