• 什么是Task


    什么是Task

    Task是.Net4.0新增用来处理异步编程的,叫做基于“任务编程模型”,任务其实是架构在线程之上的,具体操作的时候还是由线程去执行的,任务的管控有点类似于线程池,程序中开10个Task,不一定对应的要开10个线程,他们并不是一一对应的关系。

    1. 创建Task 
      创建Task有两种方式,一种是直接实例化,另一种是使用任务工厂生成。
    Task<int> ts = new Task<int>(TaskTest, 100);
    
    public static int TaskTest(object state)
            {
                int data = (int)state;
                int sum = 0;
                for (int i = 0; i < data; i++)
                {
                    sum++;
                }
                return sum;
            }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这里第一个参数为方法委托,可以直接传入要执行的方法名,值得注意的是这个方法的参数类型为object,若改为int,会编译不过,具体可去查看Task的构造函数的参数类型。 
    当然也可以用Lamda表达式

    Task<int> ts = new Task<int>((state) =>
                {
                    int data = (int)state;
                    int sum = 0;
                    for (int i = 0; i < data; i++)
                    {
                        sum++;
                    }
                    return sum;
                },10);
                ts.Start();
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    实例化的Task对象,必须用Start方法启动。 
    第二种用任务工厂直接创建的无需用Start方法启动执行,创建后就会执行

     Task<int> task = Task.Factory.StartNew<int>(
                    (state) =>
                    {
                        int data = (int)state;
                        int sum = 0;
                        for (int i = 0; i < data; i++)
                        {
                            sum++;
                        }
                        return sum;
                    }, 10);
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    Task与Task的区别是,Task是没有返回值的,而Task是有返回值的,且返回值类型为T,对于没有返回值的Task,可用Wait方法等待其执行完成,有返回值得直接用task.Result即可,记住,在等待任务执行完的过程中,是会阻塞主线程的,这也就是async和await的的作用体现了。 
    若有多个任务,比如任务1和任务2,且任务2要在任务1执行完毕后立刻启动执行,下面就来介绍Task.ContinueWith

    static void Main(string[] args)
            {
                Task<int> ts1 = new Task<int>(() => {
                    return 100;
                });
                ts1.Start();
                var re = ts1.ContinueWith<int>((task) => {
                    return task.Result + 200;
                });
                Console.WriteLine("执行结果:"+re.Result);
                Console.ReadLine();
            }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这里写图片描述 
    ContinueWith 需将ts1作为参数进行传递,即总可以把前面的一个Task用ContinueWith传递给下一个要执行的Task,下面是任务工厂的写法

    Task.Factory.StartNew<int>(() => { return 100; }).ContinueWith<int>(ts =>
                {
                    return ts.Result + 200;
    
                }).ContinueWith(task => {
                    Console.WriteLine("执行结果:" + task.Result);
                });
                Console.ReadLine();
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Mark下

  • 相关阅读:
    django虚拟环境中报E: 无法定位软件包 sqliteman
    创建django项目
    Django虚拟环境安装
    python学习笔记(三)
    python学习笔记(二)
    python学习笔记(一)
    python 类属性和实例属性
    决策树的基本ID3算法
    KNN算法的简单实现
    webClient
  • 原文地址:https://www.cnblogs.com/kdp0213/p/8760315.html
Copyright © 2020-2023  润新知