繁体   English   中英

C#TPL线程任务

[英]C# TPL Threading Task

从实现的角度来看,TPL属于Task类和并行类之间有什么区别?

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

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

您的问题非常广泛,可以包含很多详细信息作为答案,但让我限制在特定的细节上。

Task -封装一个用于执行的方法,它使用Lambda(动作,函数代表)进行相同的操作。 您可以立即包装并在以后的任何时间执行。

Parallel是一种有助于实现数据并行化的API,您可以在其中将集合(IEnumerable类型)划分为较小的块,每个块可以并行执行,最后进行汇总以达到结果

并行性大致有两种,一种是将较大的任务细分为较小的任务,将它们包装为Task类型,然后等待所有或部分任务并行完成。 这是任务并行性

在另一种方法中,您将每个数据单元都放在一个集合中并以互斥的方式进行处理,这是由Parallel.forEachParallel.For API实现的数据并行性

这些是从.Net 4.0开始引入的,以使开发人员易于使用并行性,否则我们不得不涉猎ThreadThreadPool类,这需要对线程的工作有更深入的了解,在此要解决很多复杂性内部。

但是,不要以为当前的机制不使用线程,上述两种并行形式都完全依赖于ThreadPool线程,这就是为什么我们拥有诸如上下文之类的所有东西-发生切换,调用多个线程,微软通过这样做使开发人员的生活变得轻松

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

Parallel.ForEach与Task.Factory.StartNew

并行化的过去,现在和未来

Parallel.ForEach与Task.Run和Task.WhenAll

TPL旨在最大程度地减少抢先式上下文切换(由线程超额预订引起–线程多于内核)。 任务抽象(合作伙伴使用TPL来实现)是为协作并行性设计的,开发人员在其中控制任务何时放弃执行(通常在完成时)。 如果您安排的任务多于核心任务,那么TPL将仅并行执行与核心任务数量差不多的任务; 其余的将排队。 由于它避免了上下文切换的开销,但是却降低了响应能力,因为每项任务可能需要更长的时间才能开始处理,因此可以促进整个过程。

Parallel类是基于TPL的更高级别的抽象。 在实现方面,Parallel会生成任务图,但可以根据您的工作使用启发式方法来确定所述任务的粒度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM