• 一起谈.NET技术,.Net4.0 Parallel编程(四)Task 上 狼人:


      在之前的文章中,已经介绍过了Parallel Loop()的相关内容。本篇文章中会就Task基础部分进行些介绍。

      初识Task

      首先我们来构建一个简单的Task的Demo:

    static void Main(string[] args)
    {
    Task.Factory.StartNew(()
    =>
    {
    Console.WriteLine(
    "Hello word!");
    });
    Console.Read();
    }

      在上面这段代码中我们构建出了一段非常简单的使用Task类的代码,通过其Factory属性的创建出一个Task。其运行结果可想而知。其实上面的代码跟:

    static void Main(string[] args)
    {
    Task task
    = new Task(() =>
    {
    Console.WriteLine(
    "Hello,Word!");
    });
    task.Start();
    Console.Read();
    }

      是一样的,只是StartNew方法直接构建出了一个Task之后又调用了其Start方法。在Task内部执行的内容我们称作为Task的Body,Task提供了多个初始化重载的方法。我们来看下面一个示例:

    static void Main(string[] args)
    {
    Task task1
    = new Task(() =>
    {
    Console.WriteLine(
    "Message: Say \"Hello\" from task1");
    });
    Task task2
    = new Task(new Action<object>(printMessage),
    "Say \"Hello\" from task2");

    Task task3
    = new Task((obj) => { printMessage(obj); },
    "Say \"Hello\" from task3");

    Task task4
    = new Task((obj) => { Console.WriteLine("Message: {0}", obj); },
    "Say \"Hello\" from task4");

    task1.Start();
    task2.Start();
    task3.Start();
    task4.Start();
    Console.Read();
    }

      上面的例子中使用了重载方法的State参数,其运行结果:

    image  好像结果跟我们想象的优点不太一样,其实我们仔细想想就可以理解了。

      返回值

    static void Main(string[] args)
    {
    var loop
    = 0;
    var task1
    = new Task<int>(() =>
    {
    for (var i = 0; i < 1000; i++)
    loop
    += i;
    return loop;
    });
    task1.Start();
    var loopResut
    = task1.Result;
    var task2
    = new Task<long>(obj=>
    {
    long res = 0;
    var looptimes
    = (int)obj;
    for (var i = 0; i < looptimes; i++)
    res
    += i;
    return res;
    },loopResut);

    task2.Start();
    var resultTask2
    = task2.Result;

    Console.WriteLine(
    "Task1's result:{0}\nTask2's result:{1}",
    loopResut,
    resultTask2);
    Console.ReadKey();
    }

      运行的结果:

    image  在这里要说的是,Result属性的获取是在一个Task运行完成才会获取的,所以上面的task2是在task1运行完成后,才开始运行,也就是说上面的两个result的值不管运行多少次都是不会变的。其中我们也可以通过CurrentId来获取当前运行的Task的编号,但是要注意的一点,如果我们再Task的body之外获取他将会返回null。

      总结

      在这篇文章中我们看到了如何创建一个Task,以及使用其返回值的属性的介绍。下篇文中我们会看下如何取消一个Task。

  • 相关阅读:
    小米路由通过SSH添加静态路由表之后无法跳转的问题
    极路由通过SSH添加静态路由表之后无法跳转的问题
    Linux服务器压测/拷机软件收集
    RabbitMQ整合Spring Booot【消费者补偿幂等问题】
    找不到共享解决办法
    如何一步步设计一款微服务的补偿方案
    Spring Cloud 支付宝支付的流程
    把同事的重复代码清理干净,老板却让我做了回滚?
    [LeetCode] 565. Array Nesting 数组嵌套
    [LeetCode] Out of Boundary Paths 出界的路径
  • 原文地址:https://www.cnblogs.com/waw/p/2162766.html
Copyright © 2020-2023  润新知