.Net 多線程 (1) Task
多線程是一種有效提高程序工作效率的方法。當然為了效率需要使用更多的cpu,內存等資源。
並發是兩個隊列交替使用一臺咖啡機,並行是兩個隊列同時使用兩臺咖啡機,如果串行,一個隊列使用一臺咖啡機,那麽哪怕前面那個人便秘了去廁所呆半天,後面的人也只能死等著他回來才能去接咖啡,這效率無疑是最低的。
並發和並行都可以是很多個線程,就看這些線程能不能同時被(多個)cpu執行,如果可以就說明是並行,而並發是多個線程被(一個)cpu 輪流切換著執行。
運行一個線程
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 new Thread(Go).Start(); // .NET 1.0開始就有的 6 Task.Factory.StartNew(Go); // .NET 4.0 引入了 TPL 7 Task.Run(new Action(Go)); // .NET 4.5 新增了一個Run的方法 8 Console.WriteLine("我是Main線程 {0}", Thread.CurrentThread.ManagedThreadId.ToString());9 var dayName = Task.Run<string>(() => { return GetDayOfThisWeek(); }); 10 Console.WriteLine("今天是:{0}", dayName.Result); 11 Console.ReadLine(); 12 13 } 14 public static void Go() 15 { 16 Console.WriteLine("我是另一個線程 {0}", Thread.CurrentThread.ManagedThreadId.ToString()); 17 } 18 19 public static string GetDayOfThisWeek() 20 { 21 return string.Format("結果{0}", Thread.CurrentThread.ManagedThreadId.ToString()); 22 } 23 }
TaskFactory 類
- 創建一個任務,並通過調用立即啟動該 StartNew 方法
任務等待
-
創建一個任務,在數組中的任務之一通過調用完成後開始 ContinueWhenAny 方法。
-
創建一個任務,在數組中的所有任務已都完成通過調用開始 ContinueWhenAll 方法。
AsyncState |
獲取在創建 Task 時提供的狀態對象,如果未提供,則為 null。 |
|
CompletedTask |
獲取一個已成功完成的任務。 |
|
CreationOptions |
獲取用於創建此任務的 TaskCreationOptions。 |
|
CurrentId |
返回當前正在執行 Task 的 ID。 |
|
Exception |
獲取導致 AggregateException 提前結束的 Task。 如果 Task 成功完成或尚未引發任何異常,這將返回 null。 |
|
Factory |
提供對用於創建 Task 和 Task<TResult> 的工廠方法的訪問。 |
|
Id |
獲取此 Task 實例的 ID。 |
|
IsCanceled |
獲取此 Task 實例是否由於被取消的原因而已完成執行。 |
|
IsCompleted |
獲取此 Task 是否已完成。 |
|
IsFaulted |
獲取 Task 是否由於未經處理異常的原因而完成。 |
|
Status |
獲取此任務的 TaskStatus。 |
https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task(v=vs.110).aspx
當然這裏並不考慮對共享數據的操作,多個線程在對同一數據源進行操作的時候,不控制順序可能會產生意想不到的後果。
.Net 多線程 (1) Task