• c#并行编程三——task


    转自:

    http://www.cnblogs.com/woxpp/p/3928788.html

    任务简介:

    tpl引入新的基于任务的编程模型,通过这种编程模型可以发挥多核的功效,提升应用程序的性能,不需要编写底层复杂且重量级的线程代码。

    但需要注意:任务并不是线程(任务运行的时候需要使用线程,但并不是说任务取代了线程,任务代码是使用底层的线程【软件线程,调度在特定的硬件线程逻辑内核上】运行的,任务与线程之间并没有一对一的关系。)

    创建一个新的任务时,调度器(调度器依赖于底层的线程池引擎)会使用工作窃取队列找到一个最合适的线程,然后将任务加入队列,任务所包含的代码会在一个线程中运行。

    system.Threading.Tasks.Task

    一个Task表示一个异步操作,Task提供了很多方法和属性,通过这些方法和属性能够对Task的执行进行控制,并且能够获得其状态信息。

    task的创建和执行都是独立的,因此可以对关联操作的执行拥有完全的控制权。

    使用Parallel.For、Parallel.ForEach的循环迭代的并行,tpl会在后台创建system.threading.tasks.task的实例。

    使用Parallel.Invoke时,tpl也会创建与调用的委托数目一致的system.threading.tasks.task的实例

    注意项

    程序中添加很多异步的操作作为task实例加载的时候,为了充分利用运行时所有可用的逻辑内核,任务调度器会尝试的并行的运行这些任务,也会尝试在所有的可用内核上对工作进行负载均衡。

    但在实际的编码过程当中,并不是所有的代码片段都能够方便的用任务来运行,因为任务会带来额外的开销,尽管这种开销比添加线程所带来的开销要小,但是仍然需要将这个开销考虑在内。

    Task状态与生命周期

    一个Task实例只会完成其生命周期的一次,当Task到达它的3种可能的最终状态之一,就无法回到之前的任何状态。

    View Code

    使用任务来对代码进行并行化

    使用Parallel.Invoke可以并行加载多个方法,使用task实例也能完成同样的工作,

  • 相关阅读:
    Web开发人员必备工具-Emmet (Zen Coding)
    Zerver是一个C#开发的Nginx+PHP+Mysql+memcached+redis绿色集成开发环境
    jquery 插件站
    数据挖掘项目之---通过对web日志的挖掘来实现内容推荐系统
    类似wordpress的网站模板
    浅谈 SOAP
    在Livemedia的基础上开发自己的流媒体客户端 V 0.01
    模式识别之分类器knn---c语言实现带训练数据---反余弦匹配
    多项式相乘快速算法原理及相应C代码实现---用到fft
    模式识别之基础---常用分类算法特性归纳
  • 原文地址:https://www.cnblogs.com/cacti/p/9681424.html
Copyright © 2020-2023  润新知