C#TPL线程任务

时间:2015-08-02 07:07:48

标签: c#

在实现的角度来看,Task类和并行类的哪一部分是TPL的一部分。?

我相信任务类比线程池和线程有更多的好处,但是在任务类中仍然会发生上下文切换。

但并行类基本上是设计在多核处理器上运行程序吗?

2 个答案:

答案 0 :(得分:1)

您的问题非常广泛,可以包含大量细节作为答案,但我要限制具体细节。

Task - 包装一个执行方法,它使用Lambda(Action,Func Delegate)来做同样的事情。您可以立即换行并在以后随时执行。

Parallel是一个有助于实现数据并行化的API,您可以将集合(IEnumerable类型)划分为更小的块,每个块可以并行执行,最后聚合以实现结果

大致有两种并行性,一种是你可以将较大的任务细分为较小的任务,将它们包装在一个Task类型中,并等待它们中的全部或部分并行完成。这是任务并行性

在另一个中,您将每个数据单元放在一个集合中,并以互斥的方式对其进行处理,即Parallel.forEachParallel.For API实现的数据并行性

这些是从.Net 4.0开始引入的,以便为开发人员提供简单的并行性,否则我们不得不涉及ThreadThreadPool类,这需要更深入地了解工作线程,这里很多复杂性都在内部处理。

但是,不要认为当前机制不使用线程,上面提到的并行形式完全依赖于ThreadPool线程,这就是为什么我们有像context -switching这样的东西发生的原因,多个线程被调用,只是微软通过这样做让开发人员生活变得轻松

您可能需要查看以下链接以便更好地理解,如果仍有特定查询,请告诉我们:

Parallel.ForEach vs Task.Factory.StartNew

Past, Present and Future of Parallelism

Parallel.ForEach vs Task.Run and Task.WhenAll

答案 1 :(得分:0)

TPL旨在最大限度地减少先发制人的上下文切换(由线程超额订阅引起 - 拥有比核心更多的线程)。任务抽象(TPL是一种实现)是为协作并行而设计的,开发人员控制任务何时放弃执行(通常在完成时)。如果您安排的任务多于核心任务,那么TPL将只执行大约与您拥有核心一样多的任务;其余的将排队。这会促进整个过程,因为它可以避免上下文切换的开销,但会降低响应速度,因为每个任务可能需要更长的时间才能开始处理。

Parallel类是构建在TPL之上的更高级别的抽象。在实现方面,Parallel生成一个任务图,但可以使用启发式方法根据您的工作决定所述任务的粒度。