zoukankan      html  css  js  c++  java
  • TPL异步并行编程之简单使用

    并行编程一直是一个老生常谈的话题

    在这里记录一下TPL编程,这在net4.0 微软就已经提供了多核时代下的并行库,其中最核心的最常用的也就是Task

    一 Task是什么

    Task可以简单的理解为一个线程的封装,向外部暴露几种接口,如常见的Task.Run,Task.Factory.StartNew;当一个Task启动后应用程序将会等待这个Task的执行,但是不会去阻塞UI线程,换句话说,我丢了一个任务跟一个线程并让他去执行,然后我马上回到UI线程,这个线程运行完了就告诉UI线程我完事了,然后继续执行Task之后的代码,这也是微软新的一种异步机制

    二  Task可以干什么,从简单的开始

    2.1 将一个耗时的操作,比如io,需要网络连接的操作,或者计算,我们直接丢一个方法交给Task去执行

    如: Task.Factory.StartNew(() =>
                {

          //耗时操作
                    Console.WriteLine("Hello World");
                });

    2.2 将一个操作丢给Task,获取Task执行完成的结果

    static void Main(string[] args)
            {
                // create the task
                Task<int> task1 = new Task<int>(() =>
                {
                    int sum = 0;
                    for (int i = 0; i < 100; i++)
                    {
                        sum += i;
                    }
                    return sum;
                });
                
                task1.Start();
                // write out the result
                Console.WriteLine("Result 1: {0}", task1.Result);
                
                Console.ReadLine();
            }

    2.3 向Task执行的方法传入参数,其实这个基本没什么用,因为要执行的函数本身可以直接使用参数

    如;static void Main(string[] args)
            {
                string[] messages = { "First task", "Second task",
    "Third task", "Fourth task" };
                foreach (string msg in messages)
                {

          //这里printMessage需要的参数可以直接使用msg,所以Task传递的msg其实没多大用,

          //  Task myTask = new Task(() => printMessage( msg), msg);

      
                    Task myTask = new Task(obj => printMessage((string)obj), msg);
                    myTask.Start();
                }
                // wait for input before exiting
                Console.WriteLine("Main method complete. Press enter to finish.");
                Console.ReadLine();
            }

            static void printMessage(string message)
            {
                Console.WriteLine("Message: {0}", message);
            }

    2.4 如果需要Task长时间运行

    直接在函数体进行如线程的循环即可:

    如:Task.Run(()=>{

      while(true)

      {

        //循环体

      }

    });

    2.5  Task相关参数

    2.5.1 优先级

    线程都是有优先级的,那么怎样用,怎么设置的:通过构造函数

        TaskCreateOptions.None:用默认的方式创建一个Task
        TaskCreateOptions.PreferFairness:请求scheduler尽量公平的执行Task(后续文章会将是,Task和线程一样,有优先级的)
        TaskCreateOptions.LongRunning:声明Task将会长时间的运行。
        TaskCreateOptions.AttachToParent:因为Task是可以嵌套的,所以这个枚举就是把一个子task附加到一个父task中。

  • 相关阅读:
    Win10 安装GNU 编译器(gcc、g++ 和 gfortran)
    三维地图制作 数据选型 相关参考资料
    借助mapshaper的简化来修复geojson的拓扑错误
    一种改进后的turf.idw算法
    基于Geojson的点集的抽稀Js实现
    OL3-Cesium 二三维鼠标事件统一处理
    About TopoJSON
    基于 geojson数据类型面转线Transforms Polygons and MultiPolygons to LineStrings.
    数据库文档编写辅助脚本
    Extensible Messaging and Presence Protocol (XMPP): Core
  • 原文地址:https://www.cnblogs.com/rjjs/p/5583722.html
Copyright © 2011-2022 走看看