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);html
Task t4 = Task.Factory.StartNew(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("ii is " + i);
Thread.Sleep(1000);
}
});程序員
每一個方法本身運行一遍也就知道了。這裏就不解釋了。
一、首次構造一個Task對象時,他的狀態是Created。
二、當任務啓動時,他的狀態變成WaitingToRun。
三、Task在一個線程上運行時,他的狀態變成Running。
四、任務中止運行,等待他的任何子任務時,狀態變成WaitingForChildrenToComplete。
五、任務徹底結束時,它進入如下三個狀態之一:RanToCompletion,Canceled或者Faulted。
六、一個Task<TResult>運行完成時,可經過Task<TResult>的Result屬性來查詢任務的結果,
七、一個Task或者Task<TResult>出錯時,能夠查詢Task的Exception屬性來得到任務拋出的未處理的異常,該屬性老是返回一個AggregateException對象,他包含全部未處理的異常。
八、爲簡化代碼,Task提供了幾個只讀的Boolean屬性,IsCanceled,IsFaulted,IsCompleted。
九、注意,當Task處於RanToCompleted,Canceled或者Faulted狀態時,IsCompleted返回True。
十、爲了判斷一個Task是否成功完成,最簡單的方法是:if(task.Status == TaskStatus.RanToCompletion)。
十一、task的ContinueWith方法用於在一個任務完成後發起一個新任務。
十二、任務的啓動、中止與異常處理
(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);
}
});
以上是一些簡單的使用方式,待工做中深刻應用後再進行補充任務的其餘使用。