程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> c# .Net並行和多線程編程之Task學習記錄!,

c# .Net並行和多線程編程之Task學習記錄!,

編輯:關於.NET

c# .Net並行和多線程編程之Task學習記錄!,


任務Task和線程Thread的區別:

1、任務是架構在線程之上的,也就是說任務最終還是要拋給線程去執行。

2、任務跟線程不是一對一的關系,比如開10個任務並不是說會開10個線程,這一點任務有點類似線程池,但是任務相比線程池有很小的開銷和精確的控制。

Task和Thread一樣,位於System.Threading命名空間下!

一、創建Task

 //第一種創建方式,直接實例化
   var task1 = new Task(() =>
    {
       //TODO you code
    });
//第二種創建方式,工廠創建
   var task2 = Task.Factory.StartNew(() =>
    {
     //TODO you code
    });

二、Task的簡略生命周期:

Created:表示默認初始化任務,但是“工廠創建的”實例直接跳過。
WaitingToRun: 這種狀態表示等待任務調度器分配線程給任務執行。
RanToCompletion:任務執行完畢。

三、Task的任務控制

Task最吸引人的地方就是他的任務控制了,你可以很好的控制task的執行順序,讓多個task有序的工作。下面來詳細說一下:

1、Task.Wait

task1.Wait();就是等待任務執行(task1)完成,task1的狀態變為Completed。

2、Task.WaitAll

看字面意思就知道,就是等待所有的任務都執行完成:

 {...

Task.WaitAll(task,task2,task3...N)
Console.WriteLine("All task finished!");
}
即當task,task2,task3...N全部任務都執行完成之後才會往下執行代碼(打印出:“All task finished!”)

3、Task.WaitAny

這個用發同Task.WaitAll,就是等待任何一個任務完成就繼續向下執行,將上面的代碼WaitAll替換為WaitAny

 {...

Task.WaitAny(task,task2,task3...N)
Console.WriteLine("Any task finished!");
}
即當task,task2,task3...N任意一個任務都執行完成之後就會往下執行代碼(打印出:" Any task finished!”)

4、Task.ContinueWith

就是在第一個Task完成後自動啟動下一個Task,實現Task的延續,下面我們來看下他的用法,編寫如下代碼:
      static void Main(string[] args)
		{
			var task1 = new Task(() =>
			{
				Console.WriteLine("Task 1 Begin");
				System.Threading.Thread.Sleep(2000);
				Console.WriteLine("Task 1 Finish");
			});
			var task2 = new Task(() =>
			{
				Console.WriteLine("Task 2 Begin");
				System.Threading.Thread.Sleep(3000);
				Console.WriteLine("Task 2 Finish");
			});
			task1.Start();
			task2.Start();
			var result = task1.ContinueWith<string>(task =>
			{
				Console.WriteLine("task1 finished!");
				return "This is task result!";
			});
			Console.WriteLine(result.Result.ToString());
			Console.Read();
		}


可以看到,task1完成之後,開始執行後面的內容,並且這裡我們取得task的返回值。

5、Task的取消

前面說了那麼多Task的用法,下面來說下Task的取消,比如我們啟動了一個task,出現異常或者用戶點擊取消等等,我們可以取消這個任務。如何取消一個Task呢,我們通過cancellation的tokens來取消一個Task。在很多Task的Body裡面包含循環,我們可以在輪詢的時候判斷IsCancellationRequested屬性是否為True,如果是True的話就return或者拋出異常,拋出異常後面再說,因為還沒有說異常處理的東西。

 下面在代碼中看下如何實現任務的取消,代碼如下:

          var tokenSource = new CancellationTokenSource();
			var token = tokenSource.Token;
			var task = Task.Factory.StartNew(() =>
			{
				for (var i = 0; i < 1000; i++)
				{
					System.Threading.Thread.Sleep(1000);
					if (token.IsCancellationRequested)
					{
						Console.WriteLine("Abort mission success!");
						return;
					}
				}
			}, token);
			token.Register(() =>
			{
				Console.WriteLine("Canceled");
			});
			Console.WriteLine("Press enter to cancel task...");
			Console.ReadKey();
			tokenSource.Cancel();

這裡開啟了一個Task,並給token注冊了一個方法,輸出一條信息,然後執行ReadKey開始等待用戶輸入,用戶點擊回車後,執行tokenSource.Cancel方法,取消任務。
更多信息:關於Task類
素材收集於網絡,理解如有偏頗請回復指正!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved