自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

.NET 4并行編程入門之Task基礎(chǔ)

開發(fā) 后端
本文將介紹的是.NET 4并行編程入門,包括Task方面的基礎(chǔ)以及Task的創(chuàng)建信息和獲得Task的執(zhí)行結(jié)果。希望對大家有所幫助。

查看本系列其他文章,請參看

[[11656]]

本篇文章的議題如下:

1.Task基礎(chǔ)介紹

2.Task的創(chuàng)建

3.獲取Task的執(zhí)行結(jié)果

4. 補充細(xì)節(jié)

1.Task基礎(chǔ)介紹

首先我們還是來看看一段簡單的代碼:

這里展示的只是一段簡單的代碼,不能顯示出并行編程的特點。但是我們還是從最基本的開始看,慢慢進(jìn)入深一點的話題。

如果你曾經(jīng)用過.NET 中的多線程編程,比較一下,就會發(fā)現(xiàn):這段代碼雖然在底層還是使用了多線程,但是寫法上卻簡化了很多,一行代碼就實現(xiàn)了一個并行編程。

下面我們就從Task類開始談。

Task類是Task Programming Library(TPL)中最核心的一個類,下面我將會像大家展示如何使用一些方法來創(chuàng)建不同類型的Task,

取消Task,等待Task執(zhí)行完成,獲取Task執(zhí)行后的結(jié)果和對異常進(jìn)行處理。

在開始討論之前,我們首先快速的看看之前的代碼:

這個命名空間將會是我們之后在講述并行編程經(jīng)常使用的一個。這個空間包含了很多與并行編程有關(guān)的類。

還有一個要你使用的命名空間是:System.Threading,大家對這個應(yīng)該比較熟悉了,之前的多線程編程常常使用到,這個空間下包含了一些在并行編程中用來協(xié)調(diào)數(shù)據(jù)的一些類。

上面代碼中,最主要的代碼如下:

  1.   Task.Factory.StartNew(() =>  
  2. {  
  3. Console.WriteLine("Hello World");  
  4. }); 

我們用靜態(tài)方法:Task.Factory.StartNew()來創(chuàng)建了一個最簡單的Task--在屏幕上打印一句話。這段代碼確實簡單,而且都沒有任何輸入和需要返回的結(jié)果。

下面我們就正式進(jìn)入議題:

2.Task的創(chuàng)建

如果只是創(chuàng)建一個簡單的Task,我們只要為該Task提供一個執(zhí)行體就行了,執(zhí)行體可以是一個委托delegate或者action。我們之前展示的那段代碼就是采用了lambda表達(dá)式來作為Task的執(zhí)行體。

2.1 創(chuàng)建一個簡單的Task

為了執(zhí)行一個簡單的Task,一般進(jìn)行以下步驟:

首先,要創(chuàng)建一個Task類的實例,

然后,傳入一個System.Action委托,這個委托中的方法就是這個Task運行時你要執(zhí)行的方法,而且這個委托必須作為Task構(gòu)造函數(shù)的一個參數(shù)傳入。我們在傳入委托作為參數(shù)的時候有多種方式:傳入匿名委托,

Lambda表達(dá)式或者一個顯示什么方法的委托。

***,調(diào)用Task實例的Start()方法來運行。

當(dāng)這個Task實例開始運行的時候,它就被傳給了內(nèi)部的一個task scheduler,這個scheduler負(fù)責(zé)把我們創(chuàng)建的task交給底下的線程去執(zhí)行。

下面就看看代碼:

代碼

  1. using System;  
  2. using System.Threading.Tasks;  
  3. namespace Listing_02  
  4. {  
  5. class Listing_02  
  6. {  
  7. static void Main(string[] args)  
  8. {  
  9.  
  10. // use an Action delegate and a named method  
  11. Task task1 = new Task(new Action(printMessage));  
  12. // use a anonymous delegate  
  13. Task task2 = new Task(delegate 
  14. {  
  15. printMessage();  
  16. });  
  17.  
  18. // use a lambda expression and a named method  
  19. Task task3 = new Task(() => printMessage());  
  20. // use a lambda expression and an anonymous method  
  21. Task task4 = new Task(() =>  
  22. {  
  23. printMessage();  
  24. });  
  25.  
  26. task1.Start();  
  27. task2.Start();  
  28. task3.Start();  
  29. task4.Start();  
  30. // wait for input before exiting  
  31. Console.WriteLine("Main method complete. Press enter to finish.");  
  32. Console.ReadLine();  
  33. }  
  34.  
  35. static void printMessage()  
  36. {  
  37. Console.WriteLine("Hello World");  
  38. }}} 

不知道大家注意到了沒有,上面代碼創(chuàng)建Task的方法和我們之前的***段代碼的創(chuàng)建Task的方法不同。在之前我們采用的是Task.Factory.StartNew()方法來創(chuàng)建的,這個方法創(chuàng)建Task并且開始運行Task,其實兩端代碼的結(jié)果是一樣的,這里給出一點建議:如果這是想簡單的創(chuàng)建一個Task,那么使用Factory.NewStart()來創(chuàng)建,很簡便,如果像對所創(chuàng)建的Task附加更多的定制和設(shè)置特定的屬性,那么還是得一步一步的按照我們說的那些步驟來。(詳細(xì)的我們后續(xù)會介紹的)

2.1 為創(chuàng)建的Task傳入?yún)?shù)  

  

我們之前提過,在創(chuàng)建Task的時候,我們在構(gòu)造函數(shù)中傳入了一個System.Action的委托,如果我們想要把一些參數(shù)傳入到Task中,那么我 們可以傳入System.Action<object>的委托,其中的那個object就是我們傳入的參數(shù)。還是給大家舉個例子:

代碼

  1. using System;  
  2. using System.Threading.Tasks;  
  3. namespace Listing_04  
  4. {  
  5. class Listing_04  
  6. {  
  7. static void Main(string[] args)  
  8. {  
  9. string[] messages = { "First task""Second task",  
  10. "Third task""Fourth task" };  
  11. foreach (string msg in messages)  
  12. {  
  13. Task myTask = new Task(obj => printMessage((string)obj), msg);  
  14. myTask.Start();  
  15. }  
  16. // wait for input before exiting  
  17. Console.WriteLine("Main method complete. Press enter to finish.");  
  18. Console.ReadLine();  
  19. }  
  20.  
  21. static void printMessage(string message)  
  22. {  
  23. Console.WriteLine("Message: {0}", message);  
  24. }}} 

注意:我們在傳入?yún)?shù)后,必須把參數(shù)轉(zhuǎn)換為它們原來的類型,然后再去調(diào)用相應(yīng)的方法。例子中,因為System.Action對應(yīng)的方法是printMessage()方法,而這個方法的要求的參數(shù)類型是string,所以要轉(zhuǎn)換為string。

想向Task傳入?yún)⑺兀荒苡肧ystem.Action<object>

3.獲取Task的執(zhí)行結(jié)果

如果要獲取Task的結(jié)果,那么在創(chuàng)建Task的時候,就要采用Task<T>來實例化一個Task,其中的那個T就是task執(zhí)行完成之后返回結(jié)果的類型。之后采用Task實例的Result屬性就可以獲取結(jié)果。

代碼顯示如下:

代碼 

  1.  static void Main(string[] args)  
  2. {  
  3. // create the task  
  4. Task<int> task1 = new Task<int>(() =>  
  5. {  
  6. int sum = 0;  
  7. for (int i = 0; i < 100; i++)  
  8. {  
  9. sum += i;  
  10. }  
  11. return sum;  
  12. });  
  13.  
  14. task1.Start();  
  15. // write out the result  
  16. Console.WriteLine("Result 1: {0}", task1.Result);  
  17.  
  18. Console.ReadLine();  

只有在task執(zhí)行完成之后,才能獲取到Result的值。

下面的代碼展示了如何通過Task.Factory.StartNew<T>()創(chuàng)建一個Task,并且獲取結(jié)果:

代碼 

  1. static void Main(string[] args)  
  2. {  
  3. // create the task  
  4. Task<int> task1 = Task.Factory.StartNew<int>(() =>  
  5. {  
  6. int sum = 0;  
  7. for (int i = 0; i < 100; i++)  
  8. {  
  9. sum += i;  
  10. }  
  11. return sum;  
  12. });  
  13.  
  14. // write out the result  
  15. Console.WriteLine("Result 1: {0}", task1.Result);  
  16. Console.ReadLine();  

4. 補充細(xì)節(jié)  

在創(chuàng)建Task的時候,Task有很多的構(gòu)造函數(shù)的重載,一個主要的重載就是傳入TaskCreateOptions的枚舉: 

TaskCreateOptions.None:用默認(rèn)的方式創(chuàng)建一個Task

TaskCreateOptions.PreferFairness:請求scheduler盡量公平的執(zhí)行Task(后續(xù)文章會將是,Task和線程一樣,有優(yōu)先級的)

TaskCreateOptions.LongRunning:聲明Task將會長時間的運行。

TaskCreateOptions.AttachToParent:因為Task是可以嵌套的,所以這個枚舉就是把一個子task附加到一個父task中。

***要提到的一點就是,我們可以在Task的執(zhí)行體中用Task.CurrentId來返回Task的唯一表示ID(int)。如果在Task執(zhí)行體外使用這個屬性就會得到null。

(熟悉WF的朋友,可以比較Task和WF的一些區(qū)別,因為我認(rèn)為它們的設(shè)計思想很相近)

原文標(biāo)題:.NET 4 并行(多核)編程系列之二

鏈接:http://www.cnblogs.com/Leo_wl/archive/2010/05/31/1747931.html

【編輯推薦】

  1. 微軟發(fā)布新版Windows 7及.NET 4軟件開發(fā)工具包
  2. 詳解.NET 4.0并行計算支持歷史
  3. 詳讀.NET 4.0環(huán)境配置
  4. 詳解.NET 4.0中異常處理方面的新特性
  5. 三方面詮釋.NET 4.0的新特性
責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2010-06-08 08:41:08

.NET 4并行編程

2010-06-07 08:43:46

.NET 4并行編程

2010-06-09 09:18:34

.NET 4并行編程

2010-06-11 09:01:02

.NET 4并行編程

2010-06-02 08:53:51

.NET 4并行編程

2011-03-24 09:23:43

.NET 4多核并行

2010-06-24 09:12:27

.NET 4并行編程

2024-09-29 16:22:18

多線程TaskC#

2024-09-27 19:42:09

工具C#Task?

2015-10-13 09:18:00

.Net編程教程

2009-07-24 15:41:00

ASP.NET編程入門

2011-09-27 13:52:41

2024-04-07 09:04:18

Parallel 類編程工具.NET

2010-04-21 09:23:09

.NET 4

2011-07-05 17:19:47

元編程

2011-08-10 17:04:43

JavaScript

2010-01-07 09:53:09

Winform多線程編

2009-08-03 15:53:11

ASP.NET移動開發(fā)

2024-06-04 15:56:48

Task?.NET異步編程

2011-07-11 09:29:32

PHP面向?qū)ο缶幊?/a>
點贊
收藏

51CTO技術(shù)棧公眾號