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

推荐订阅源

美团技术团队
P
Proofpoint News Feed
WordPress大学
WordPress大学
P
Proofpoint News Feed
宝玉的分享
宝玉的分享
腾讯CDC
罗磊的独立博客
P
Privacy International News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Latest news
Latest news
C
Cisco Blogs
Project Zero
Project Zero
Apple Machine Learning Research
Apple Machine Learning Research
The GitHub Blog
The GitHub Blog
博客园 - 叶小钗
Spread Privacy
Spread Privacy
博客园 - 三生石上(FineUI控件)
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
博客园 - 聂微东
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tenable Blog
Know Your Adversary
Know Your Adversary
Security Latest
Security Latest
T
The Blog of Author Tim Ferriss
云风的 BLOG
云风的 BLOG
L
Lohrmann on Cybersecurity
IT之家
IT之家
T
Tor Project blog
S
SegmentFault 最新的问题
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
月光博客
月光博客
L
LINUX DO - 热门话题
C
CERT Recently Published Vulnerability Notes
T
Threat Research - Cisco Blogs
A
Arctic Wolf
D
DataBreaches.Net
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - 【当耐特】
T
The Exploit Database - CXSecurity.com
T
Threatpost
Hacker News - Newest:
Hacker News - Newest: "LLM"
Scott Helme
Scott Helme
博客园 - 司徒正美
Vercel News
Vercel News
H
Help Net Security
N
News and Events Feed by Topic
MyScale Blog
MyScale Blog
Simon Willison's Weblog
Simon Willison's Weblog
P
Privacy & Cybersecurity Law 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