C#中Task的使用簡單總結


Task在並行計算中的作用很凸顯,但是他的使用卻有點小復雜,下面是任務的一些基本使用說明(轉載與總結於多篇文章)
簡單點說說吧!
創建 Task
創建Task有兩種方式,一種是使用構造函數創建,另一種是使用 Task.Factory.StartNew 進行創建。如下代碼所示
一.使用構造函數創建Task
Task t1 = new Task(MyMethod);
二.使用Task.Factory.StartNew 進行創建Task
Task t1 = Task.Factory.StartNew(MyMethod);
其實方法一和方法二這兩種方式都是一樣的,Task.Factory 是對Task進行管理,調度管理這一類的。好學的伙伴們,可以深入研究。這不是本文的范疇,也許會在后面的文章細說。
也可參考下面的方法:
Task t1 = Task.Factory.StartNew(delegate { MyMethodA(); });
Task t2 = Task.Factory.StartNew(delegate { MyMethodB(); });

Task t3 = Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("i is " + i);
Thread.Sleep(1000);
}
});
Console.WriteLine("t3:"+t3.Status);
Thread.Sleep(10);
Console.WriteLine("t3:"+t3.Status);
Task.WaitAll(t3);

Task t4 = Task.Factory.StartNew(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("ii is " + i);
Thread.Sleep(1000);
}
});



每個方法自己運行一遍也就知道了。這里就不解釋了。

1、首次構造一個Task對象時,他的狀態是Created。
2、當任務啟動時,他的狀態變成WaitingToRun。
3、Task在一個線程上運行時,他的狀態變成Running。
4、任務停止運行,等待他的任何子任務時,狀態變成WaitingForChildrenToComplete。
5、任務完全結束時,它進入以下三個狀態之一:RanToCompletion,Canceled或者Faulted。
6、一個Task<TResult>運行完成時,可通過Task<TResult>的Result屬性來查詢任務的結果,
7、一個Task或者Task<TResult>出錯時,可以查詢Task的Exception屬性來獲得任務拋出的未處理的異常,該屬性總是返回一個AggregateException對象,他包含所有未處理的異常。
8、為簡化代碼,Task提供了幾個只讀的Boolean屬性,IsCanceled,IsFaulted,IsCompleted。
9、注意,當Task處於RanToCompleted,Canceled或者Faulted狀態時,IsCompleted返回True。
10、為了判斷一個Task是否成功完成,最簡單的方法是:if(task.Status == TaskStatus.RanToCompletion)。
11、task的ContinueWith方法用於在一個任務完成后發起一個新任務。
12、任務的啟動、停止與異常處理
(1)任務的啟動:
CancellationTokenSource cts = new CancellationTokenSource();
Task task = new Task(() => ThreadGetData(cts.Token), cts.Token);
private void ThreadGetData(CancellationToken ct)//ThreadGetData是自己的一個方法,用於每分鍾讀取一次數據
{
ReadDataOneMinite(ct);
}
task.Start();//任務啟動
(2)任務的停止:
任務和線程並不是調用者想停止就能停止的,正確停止線程更多地在於工作線程是否能主動響應調用者的停止請求。在基於Task的任務執行過程中,我們通常使用CancellationTokenSource來實現任務取消。CancellationTokenSource 是一種名為“取消標記”的輕型對象,用於線程和任務的協作取消。線程和任務在工作的同時,會以某種頻率檢測CancellationTokenSource的IsCancellationRequested標識,若檢測到IsCancellationRequested,線程自己負責退出。下面是線程取消的一段代碼示例:
CancellationTokenSource
cts =
new CancellationTokenSource();
Task task =
new Task(()
=>
{
while (true)
{
if (cts.Token.IsCancellationRequested)//如果檢測到取消請求
{
Console.WriteLine("線程被終止!");
break;
}
//否則執行某工作

ReadDataOneMinite(ct);//用於每分鍾讀取一次數據
Thread.Sleep(60000);
}
});
task.Start();
cts.Cancel();//任務取消
調用者使用CancellationTokenSource的Cancle方法通知工作線程退出。工作線程則以大致60000毫秒的頻率一邊工作,一邊檢查是否有外界傳入進來的Cancel信號。若有這樣的信號,則負責退出。協作式取消中的關鍵類型是CancellationTokenSource。它有一個關鍵屬性Token,Token是一個名為CancellationToken的值類型。CancellationToken繼而進一步提供了布爾值的屬性IsCancellationRequested作為需要取消工作的標識。

(3)任務的異常處理:
CancellationTokenSource cts
=
new CancellationTokenSource();
Task
task =
new Task(()
=>
{
while (true)
{
if (cts.Token.IsCancellationRequested)//如果檢測到取消請求
{
cts.Token.ThrowIfCancellationRequested();//異常處理來退出程序,但CLR知道這一行是程序員有意為之,所以並不
把它當做一個異常(它被理解為取消)
break;
}
//否則執行某工作

ReadDataOneMinite(ct);//用於每分鍾讀取一次數據
Thread.Sleep(60000);
}
});
以上是一些簡單的使用方式,待工作中深入應用后再進行補充任務的其他使用。
 
參考:
https://www.cnblogs.com/wjcnet/p/6955756.html
https://blog.csdn.net/minminsu/article/details/18659889


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM