C语言task的用法,C# Task 用法
C# Task 的用法
其實Task跟線程池ThreadPool的功能類似,不過寫起來更為簡單,直觀。代碼更簡潔了,使用Task來進行操作。可以跟線程一樣可以輕松的對執行的方法進行控制。
順便提一下,配合CancellationTokenSource類更為可以輕松的對Task操作的代碼進行中途終止運行,會在后面的章節中講述。
如果我們使用線程池來實現某幾個方法運行,然后等待運行完成的大概會編寫如下代碼:
using(ManualResetEvent m1 =newManualResetEvent(false))
using(ManualResetEvent m2 =newManualResetEvent(false))
{
ThreadPool.QueueUserWorkItem(delegate
{
MyMethodA();
m1.Set();
});
ThreadPool.QueueUserWorkItem(delegate
{
MyMethodB();
m2.Set();
});
WaitHandle.WaitAll(newWaitHandle[]{ m1, m2,});
}
如果用Task類的話,相對就比較簡單了,至少代碼看起來很舒服。也就意味著維護也比較方便
Task t1 =Task.Factory.StartNew(delegate{MyMethodA();});
Task t2 =Task.Factory.StartNew(delegate{MyMethodB();});
t1.Wait();
t2.Wait();
上面的方法是一個一個的執行完畢,獲取不是我們想要的,我們一般是想要他們一起同時執行,提高程序處理事情的效率。
Task t1 =Task.Factory.StartNew(delegate{MyMethodA();});
Task t2 =Task.Factory.StartNew(delegate{MyMethodB();});
Task.WaitAll(t1, t2);
下面我們來簡單介紹下Task的用法
創建 Task
創建Task有兩種方式,一種是使用構造函數創建,另一種是使用 Task.Factory.StartNew 進行創建。如下代碼所示
1.使用構造函數創建Task
Task t1 =newTask(MyMethod);
2.使用Task.Factory.StartNew 進行創建Task
Task t1 =Task.Factory.StartNew(MyMethod);
其實這兩種方式都是一樣的,Task.Factory 是對Task進行管理,調度管理這一類的。好學的伙伴們,可以深入研究。這不是本文的范疇,也許會在后面的文章細說。
運行 Task
運行Task的兩種方式,在上面我們已經提到過了,一種等待運行完畢,另一種則等待所有運行完畢。不過這里還有一種就是異步運行,跟使用多線程一樣,調用Task對象中的Start()方法即可。看看下面這個控制臺示例。純粹是Wait和AllWait的話,僅僅是等待。而不是執行。所以我們還需要調用Start()方法
staticvoidMain(string[] args)
{
Task t1 =newTask(MyMethod);
t1.Start();
Console.WriteLine("主線程代碼運行結束");
Console.ReadLine();
}
staticvoidMyMethod()
{
for(int i =0; i <5; i++)
{
Console.WriteLine(DateTime.Now.ToString());
Thread.Sleep(1000);
}
}
運行效果如圖
因為我們沒有調用Wait 所以是異步執行的~
取消Task
我們一開始就描述了?CancellationTokenSource?這個對象對Task的取消運行。一般是用不到這個方法的,一般會正常的退出所運行的代碼,如使用 bool IsExit 之類的來進行一個控制。而不是中途強制中斷代碼。
可以參考我的這篇文章:http://www.wxzzz.com/643.html
至于?CancellationTokenSource?控制Task,下一篇文章會進行詳細的一個介紹。
Task的異常處理
因為Task中是異步執行,你也可以理解為跟多線程一樣,具體錯誤捕獲需要自己去捕獲。很有意思的是Task的異常還會重新拋到Wait和AllWait中,我們可以進行方便的捕獲這些異常。如下代碼
staticvoidMain(string[] args)
{
Task t1 =newTask(MyMethod);
t1.Start();
t1.Wait();
Console.WriteLine("主線程代碼運行結束");
Console.ReadLine();
}
staticvoidMyMethod()
{
thrownewException("Task異常測試");
}
運行效果如圖
獲取 Task 的返回值
先看看代碼
Task t1 =Task.Factory.StartNew(()=>"測試");
t1.Wait();
Console.WriteLine(t1.Result);
Console.ReadLine();
返回值可以是任意的類型,因為是個泛型嘛~ 還是依然的非常簡潔的代碼。
至此,就是?C# Task?的相關用法了,歡迎回復討論。
原文轉自:http://www.wxzzz.com/683.html
原作者為 王旭
。請尊重原作者版權
SSIS Execute SQL Task 用法
Execute Sql Task組件是一個非常有用的Control Flow Task,可以直接執行SQL語句,例如,可以執行數據更新命令(update,delete,insert),也可以執行sel ...
verilog之task用法實例
該用法的代碼源自夏宇聞老師的教材. 源代碼: module traffic_lights; reg clock, red, amber, green; , off = , red_tics = , a ...
C# Task用法
1.Task的優勢 ThreadPool相比Thread來說具備了很多優勢,但是ThreadPool卻又存在一些使用上的不方便.比如: ◆ ThreadPool不支持線程的取消.完成.失敗通知等交互性 ...
Task用法(2)-任務等待wait
1.Wait 用法 ? 默認情況下,Task 是有線程池中的異步線程執行,是否執行完成,可以通過Task的的屬性IsCompleted 來判斷,? 如果想在子線程工作完成之后,在進行后續主線程工作可以 ...
verilog中的task用法
任務就是一段封裝在“task-endtask”之間的程序.任務是通過調用來執行的,而且只有在調用時才執行,如果定義了任務,但是在整個過程中都沒有調用它,那么這個任務是不會執行的.調用某個任務時可能需要 ...
verilog 中task用法
1.任務定義? 任務定義的形式如下:? task task_id;? ????[declaration]? ????procedural_statement? endtask? 其中,關鍵詞 task ...
Task用法(1)-啟動方法
第一.基本使用 Thread,ThreadPool,Task的區別 Task是.NET4.0加入的,跟線程池ThreadPool的功能類似,用Task開啟新任務時,會從線程池中調用線程,而Thread ...
Task用法
轉: https://www.cnblogs.com/wyy1234/p/9172467.html
隨機推薦
js 小數格式化函數
直接上代碼,參數number為待格式化整數或小數,fix是要保留有效位數,過億以億結尾,過萬以萬結尾,toFixed函數記得,免得再查 function shorten_number (number, ...
MVVM模式
MVVM的最大缺點貌似是,報錯后不好找, 在安卓6.0的時候出現了一個工具叫做databinding,其中呢主要是用來幫助實現MVVM模式的快速開發 ? 在使用databinding的時候我們需要做的 ...
python生成器之斐波切納數列
面試的時候遇到過這樣的一個題目: 斐波切納數列1,2,3,5,8,13,21.........根據這樣的規律,編程求出400萬以內最大的斐波切納數,并求出是第幾個斐波切納數. 方法一: 方法二:這個方 ...
【Web探索之旅】第二部分第五課:響應式網站和移動應用
內容簡介 1.第二部分第五課:響應式網站和移動應用 2.第三部分第一課預告:服務器 第二部分第五課:響應式網站和移動應用 在我們開始聊響應式網站之前,我們可以聊聊移動App(App是Applicati ...
納稅服務系統【信息發布管理、Ueditor、異步信息交互】
需求分析 我們現在來到了納稅服務系統的信息發布管理模塊,首先我們跟著原型圖來進行需求分析把: 一些普通的CRUD,值得一做的就是狀態之間的切換了.停用和發布切換. 值得注意的是:在信息內容中,它可以帶 ...
python列表的操作
1.列表的增加: li=[] li.append("hha") print(li) li=[] li.append("hha") print(li) li.in ...
BZOJ_2242_[SDOI2011]計算器_快速冪+擴展GCD+BSGS
BZOJ_2242_[SDOI2011]計算器_快速冪+擴展GCD+BSGS 題意: 你被要求設計一個計算器完成以下三項任務: 1.給定y,z,p,計算Y^Z Mod P 的值: 2.給定y,z,p, ...
原生JS實現簡易評論更新功能
...彈性盒模型,flex布局
彈性盒模型 ??彈性盒子是css3的一種新布局模式,由容器(父元素)和項目(子元素)組成. 彈性盒子是一種當頁面需要適應不同的屏幕大小以及設備類型時確保元素擁有恰當的行為的布局方式. 引入彈性盒模型的 ...
不同數據庫下的web.config中數據庫連接字符串
總結
以上是生活随笔為你收集整理的C语言task的用法,C# Task 用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flex语法和常用鼠标手势
- 下一篇: Learning C++ No.14【S