• Net 4.0 Parallel 编程(四) Task(上)


    .Net 4.0 Parallel 编程(四) Task(上)

    2010-10-18 22:27 by Henry Cui, 2150 visits, 收藏, 编辑

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

    初识Task

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

    1
    2
    3
    4
    5
    6
    7
    8
    static void Main(string[] args)
    {
        Task.Factory.StartNew(() =>
        {
            Console.WriteLine("Hello word!");
        });
        Console.Read();
    }

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    static void Main(string[] args)
    {
        Task task = new Task(() =>
        {
            Console.WriteLine("Hello,Word!");
        });
        task.Start();
        Console.Read();
    }

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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

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

    返回值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    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。

    alt
    作者:Henllyee Cui
    出处: http://henllyee.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。
  • 相关阅读:
    WPF Attached event
    WPF Progressbar
    IDisposable
    CommandTarget属性
    观察者模式
    DesignerSerializationVisibility, Browsable,Category Attribute
    CVS使用手册
    Javascript原型的简单理解
    由插件独特的处理器产生页面
    教训
  • 原文地址:https://www.cnblogs.com/dajiang02/p/2344839.html
Copyright © 2020-2023  润新知