解决方案 »

  1.   


    var result = typeAList.AsParallel().WithDegreeOfParallelism(10).Select(methodA).ToArray();另外,线程太多没有意义,最多CPU核心数就够了
      

  2.   

    异步回调主要是用来设计灵活的线程操作。比如说系统 I/O 线程池里的线程通常比Worker线程池里的线程的调用频繁得多,因此当系统接收到一个消息,应该尽快释放此线程(否则影响系统接收效率),所以消息的解析、执行、返回结果等都是异步的(而且是使用Worker线程池里的线程执行的)。如果你满脑子就是“输入、输出”这种函数式概念,那么其实你此时并没有什么灵活的线程操作思路,你就是需要“死等结果”而已。这个时候你就不是在设计一个强调“流程”的程序,而是一个简单的计算程序。此时要让代码清晰,使用简洁的 PLinq 语法就足够了,什么 Thread、ThreadPool、Task等等,都不需要考虑。基本上只是在I/O操作耗时首先考虑并发。其它时间,应该先测试一下,并发不一定会让你的计算程序变快。
      

  3.   

    所谓“最多CPU核心数就够了 ”是指你的CPU利用率几乎一直保持 100% 的时候。但是这基本上都不是事实。所以就算你有2核心,并发300线程之多,也可能还是可以让你的程序加快20倍执行速度(达到最快)。关键是要知道CPU都消耗在哪里,不要盲目决定用还是不用线程。
      

  4.   


    +1
    PLinq就是为楼主这种需求而存在的
      

  5.   

    最大线程数考虑是两方面,一方面是性能,最大的限制不是为了让性能最优,而是为了让表现最优,比如用户可以同时做一些别的事情而不是整个CPU性能都被我的程序占用。另外一方面是外部限制,比如网站限制连接数之类的。
    你说的方法我去瞧一瞧。
      

  6.   

    最大线程取决于你的methodA是计算密集还是I/O密集,我说的“最多CPU核心数就够了”是在methodA是计算密集的情况下。如果大量的时间是用来等I/O的,那就不应该考虑并发很多线程,而是使用异步I/O,这样的话就直接用Task,里面的I/O调用使用异步方式,用await关键字或者ContinueWith之类的方式等待I/O完成。PLINQ一般在计算密集或者少量I/O并发的情况下方便点。