Kye*_*Kye 3 .net multithreading
我一直在研究处理多线程.NET应用程序的不同方法.它变得有点混乱.
new Thread - >当需要一个额外的线程时?
ThreadPool - >当你需要多个线程时.使用现有线程并将优化(基于所涉及的工作的数量)留给框架更便宜.
任务 - >当您需要一个额外的线程,并且您碰巧使用.net 4.0或更高版本.这是新线程的API吗?
Parallel.for - >当您有多个任务并希望框架处理优化时,根据CPU核心数分配不同任务的工作.
在MSDN上,它没有声明新的Thread方法已经过时了?
您对Threads和ThreadPool用法的基本理解或多或少是正确的.Task然而,有点复杂.
线程,ThreadPool,任务
首先,Task简单地表示异步操作.它可以在一个ThreadPool线程上执行(如果你是一个调度任务的人,那么通常它会像你TaskScheduler.Default大部分时间一样使用它).它也可以在单独的非线程池线程上执行(指定时TaskCreationOptions.LongRunning).它甚至可以在没有线程的情况下执行(想想异步IO操作:http://blog.stephencleary.com/2013/11/there-is-no-thread.html).最后,当Task封装多个异步操作时,它可以是上述任何一个的组合.
最终Task增加了抽象的层Thread和ThreadPool(其内部适当的时候使用,你有一定程度的控制权,当你安排你的任务).在这三种线程方法中Task,由于围绕它构建了语言支持,它们应该是您的首选武器.Task与使用低级线程工具执行相同操作相比,使用异步操作的序列组合是轻而易举的.
这不,但是,意味着Thread和ThreadPool是真正过时-只是,他们不应该是你的电话对新开发的第一个点.撇开即使你使用它们仍然被封面框架使用的事实Task,想一想使用的全功能生产代码的数量,Thread或者ThreadPool一旦这些类型中的任何一个标记为什么会发生什么这个ObsoleteAttribute.这将是一个烂摊子.
当然也有其他原因使用它们,即对性能非常敏感的场景(我确信还有更多,但这就是我现在所能想到的).
使用Task调度工作
当您安排新的时,您对何时使用ThreadPool或新的考虑Thread仍然适用Task.这里的指南很简单:
TaskCreationOptions.LongRunning在启动它时指定标志.这类似于启动新线程.ThreadPoolvia Task.Run(它使用默认任务调度程序,这恰好是ThreadPoolTaskScheduler当前实现中的).这类似于使用ThreadPool.QueueUserWorkItem(WaitCallback).平行
现在让我们谈谈Parallel班级及其成员.首先,你有Parallel.Invoke,这大致相当于并行启动一堆任务,然后在完成时阻塞.这在您处理要并行运行的多个阻塞操作时才非常有用.如果这是你的情况,你不想搞乱多个Task实例,请使用它.
Parallel.For并且Parallel.ForEach是一个略有不同的野兽,主要用于并行处理集合元素的CPU绑定工作(由于它们内置的"负载平衡"工作方式,将它们用于IO工作不是一个好主意,最终会产生太多的线程除非你限制并行度).这些方法在概念上不同Thread,ThreadPool而且Task,和更接近PLINQ.在平行化收集元素处理导致可测量的性能提升的情况下,将它们用于通常使用for或foreach循环的位置.
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |