成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.NET 4并行編程之Task基礎部分完結篇

開發 后端
本文將介紹的是Task基礎部分完結篇,將談到獲取Task的狀態,執行晚加載的Task(Lazily Task) 和常見問題的解決方案。

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

[[11863]]

本篇的主要議題如下:

1.獲取Task的狀態

2.執行晚加載的Task(Lazily Task)

3.常見問題的解決方案

1.獲取Task的狀態

在.NET并行編程還有一個已經標準化的操作就是可以獲取task的狀態,通過Task.Status屬性來得到的,這個屬性返回一個System.Threading.Tasks.TaskStatus的枚舉值。

如下:

Created:表明task已經被初始化了,但是還沒有加入到Scheduler中。

WatingForActivation:task正在等待被加入到Scheduler中。

 WaitingToRun:已經被加入到了Scheduler,等待執行。

Running:task正在運行

WaitingForChildrenToComplete:表明父task正在等待子task運行結束。

RanToCompletion:表明task已經執行完了,但是還沒有被cancel,而且也這個task也沒有拋出異常。

Canceled:表明task已經被cancel了。(大家可以參看之前講述取消task的文章)

Faulted:表明task在運行的時候已經拋出了異常。

2.執行晚加載的Task(Lazily Task)

晚加載,或者又名延遲初始化,主要的好處就是避免不必要的系統開銷。在并行編程中,可以聯合使用Lazy變量和Task<>.Factory.StartNew()做到這點。(Lazy變量時.NET 4中的一個新特性,這里大家不用知道Lazy的具體細節)

Lazy變量只有在用到的時候才會被初始化。所以我們可以把Lazy變量和task的創建結合:只有這個task要被執行的時候才去初始化。

下面還是通過例子來講解: 

代碼 
 

  1. static void Main(string[] args)  
  2.        {  
  3.            // define the function  
  4.            Func<string> taskBody = new Func<string>(() =>  
  5.            {  
  6.                Console.WriteLine("Task body working...");  
  7.                return "Task Result";  
  8.            });  
  9.  
  10.            // create the lazy variable  
  11.            Lazy<Task<string>> lazyData = new Lazy<Task<string>>(() =>  
  12.            Task<string>.Factory.StartNew(taskBody));  
  13.  
  14.            Console.WriteLine("Calling lazy variable");  
  15.            Console.WriteLine("Result from task: {0}", lazyData.Value.Result);  
  16.  
  17.            // do the same thing in a single statement  
  18.            Lazy<Task<string>> lazyData2 = new Lazy<Task<string>>(  
  19.            () => Task<string>.Factory.StartNew(() =>  
  20.            {  
  21.                Console.WriteLine("Task body working...");  
  22.                return "Task Result";  
  23.            }));  
  24.  
  25.            Console.WriteLine("Calling second lazy variable");  
  26.            Console.WriteLine("Result from task: {0}", lazyData2.Value.Result);  
  27.  
  28.            // wait for input before exiting  
  29.            Console.WriteLine("Main method complete. Press enter to finish.");  
  30.            Console.ReadLine();  
  31.        } 

首先我們回想一下,在之前的系列文章中我們是怎么定義一個task的:直接new,或者通過task的factory來創建,因為創建task的代碼是在main函數中的,所以只要new了一個task,那么這個task就被初始化。現在如果用了Lazy的task,那么現在我們初始化的就是那個Lazy變量了,而沒有初始化task,(初始化Lazy變量的開銷小于初始化task),只有當調用了lazyData.Value時,Lazy變量中包含的那個task才會初始化。(這里歡迎大家提出自己的理解)

3.常見問題的解決方案

a.Task 死鎖

描述:如果有兩個或者多個task(簡稱TaskA)等待其他的task(TaskB)執行完成才開始執行,但是TaskB也在等待TaskA執行完成才開始執行,這樣死鎖就產生了。

解決方案:避免這個問題最好的方法就是:不要使的task來依賴其他的task。也就是說,最好不要你定義的task的執行體內包含其他的task。

例子:在下面的例子中,有兩個task,他們相互依賴:他們都要使用對方的執行結果。當主程序開始運行之后,兩個task也開始運行,但是因為兩個task已經死鎖了,所以主程序就一直等待。

代碼

  1. static void Main(string[] args)  
  2.         {  
  3.             // define an array to hold the Tasks  
  4.             Task<int>[] tasks = new Task<int>[2];  
  5.  
  6.             // create and start the first task  
  7.             tasks[0] = Task.Factory.StartNew(() =>  
  8.             {  
  9.                 // get the result of the other task,  
  10.                 // add 100 to it and return it as the result  
  11.                 return tasks[1].Result + 100;  
  12.             });  
  13.  
  14.             // create and start the second task  
  15.             tasks[1] = Task.Factory.StartNew(() =>  
  16.             {  
  17.                 // get the result of the other task,  
  18.                 // add 100 to it and return it as the result  
  19.                 return tasks[1].Result + 100;  
  20.             });  
  21.  
  22.  
  23.             // wait for the tasks to complete  
  24.             Task.WaitAll(tasks);  
  25.  
  26.             // wait for input before exiting  
  27.             Console.WriteLine("Main method complete. Press enter to finish.");  
  28.             Console.ReadLine();  
  29.         } 

本篇就到這里了,很短,基礎的部分就基本介紹完了,后面的文章就開始講述應用。

責任編輯:彭凡 來源: 博客園
相關推薦

2010-06-04 09:11:10

.NET并行編程

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-24 09:12:27

.NET 4并行編程

2021-04-27 19:20:54

微應用模塊聯邦

2010-06-02 08:53:51

.NET 4并行編程

2018-03-27 13:26:51

教程

2021-04-25 18:42:02

Serverless 文件上傳用戶管理

2022-01-24 13:46:24

框架

2011-03-24 09:23:43

.NET 4多核并行

2014-12-25 10:48:21

程序員代碼

2025-02-24 07:39:53

2018-06-01 15:41:21

2011-07-21 10:17:53

java

2011-06-22 10:20:11

QT 鼠標 拖放

2024-09-29 16:22:18

多線程TaskC#

2024-09-27 19:42:09

工具C#Task?

2015-10-13 09:18:00

.Net編程教程

2012-02-06 13:15:37

IP-guard三重保信息防泄漏溢信科技
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 伊人最新网址 | 亚洲精品二区 | 国产偷录叫床高潮录音 | 一级片在线观看 | 欧美寡妇偷汉性猛交 | 美女爽到呻吟久久久久 | 九九热免费观看 | 91中文字幕在线观看 | 青草福利| 在线一区 | 日韩一级免费观看 | 久久一区二区三区四区 | 日韩亚洲视频 | 天堂av中文在线 | 一级免费毛片 | 久久国产精品免费一区二区三区 | 国产区一区 | 久草青青草 | 日日操视频 | 国产亚洲精品综合一区 | 国产精品久久久久久久午夜 | 日韩在线中文 | 精品欧美一区二区在线观看欧美熟 | 成人一区二区在线 | 中文欧美日韩 | 国内精品免费久久久久软件老师 | 精品国产一区二区三区观看不卡 | 国产精品久久欧美久久一区 | 九色网址 | 欧美成人一区二区三区 | 亚洲精品视频一区 | 99re视频在线 | 欧美一级黄色片在线观看 | 国产精品爱久久久久久久 | 国产精品视频一二三区 | 久久中文字幕在线 | 365夜爽爽欧美性午夜免费视频 | 亚洲精品乱码 | 亚洲精品二区 | 欧美无乱码久久久免费午夜一区 | 亚洲综合无码一区二区 |