惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Martin Fowler
Martin Fowler
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Security Blog
Microsoft Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园_首页
腾讯CDC
D
Docker
The Cloudflare Blog
量子位
爱范儿
爱范儿
L
LangChain Blog
博客园 - 三生石上(FineUI控件)
博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
Jina AI
Jina AI
Apple Machine Learning Research
Apple Machine Learning Research
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
Vercel News
Vercel News
MyScale Blog
MyScale Blog

博客园 - Henry Cui

招聘高级.Net工程师 Node.js Web开发(二)认识Express(上) Node.js Web开发(一)从零开始 Html5 Step by Step(二) 本地存储 HTML 5 Step by Step(一) 拖放API Git学习笔记(一)初识Git DDD中的Specification模式 Silverlight 4之旅(三)数据绑定(中) Silverlight 4之旅(二)数据绑定(上) Silverlight 4之旅(一) .Net 4.0 Parallel 编程之旅 .Net 4.0 Parallel 编程(九)Task中的数据共享(下) .Net 4.0 Parallel编程(八)Task中的数据共享(中) .Net 4.0 Parallel 编程(七)Task中的数据共享(上) .Net 4.0 Parallel 编程(六)Task(下) .Net 4.0 Parallel 编程(五)Task(中) Entity Framework Code-First(下) Entity Framework Code-First(上) Entity Framework POCO T4模板使用
.Net 4.0 Parallel 编程(四) Task(上)
Henry Cui · 2010-10-18 · via 博客园 - Henry Cui

2010-10-18 22:27  Henry Cui  阅读(3462)  评论()    收藏  举报

在之前的文章中,已经介绍过了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。

alt