此處介紹了多線程和多任務簡單使用:
1、多線程 Thread,可傳入參數
調用:
string id = "123456"; string name = "qt"; var data = new Data { Id = id,Name = name }; Thread t = new Thread(MainThreadWithParam); t.Start(data); // 傳入參數
參數封裝:
public struct Data { public string Id; public string Name; }
執行業務方法:
private object mylock = new object();//異步鎖,防止多個線程調用同一個方法,應對該方法不支持並發操作的情況 // 定義線程方法: private void MainThreadWithParam(object o) { Monitor.Enter(this.mylock);//啟用異步鎖 Data d = (Data)o; //類型轉換 Console.WriteLine("Running in a thread, received {0}-{1}", d.Id,d.Name); string id = d.Id; string name = d.Name; //用戶邏輯代碼 --todo Monitor.Exit(this.mylock);//關閉異步鎖 }
2、多任務 Task
ThreadPool相比Thread來說具備了很多優勢,但是ThreadPool卻又存在一些使用上的不方便。比如:
◆ ThreadPool不支持線程的取消、完成、失敗通知等交互性操作;
◆ ThreadPool不支持線程執行的先后次序;
以往,如果開發者要實現上述功能,需要完成很多額外的工作,現在,FCL中提供了一個功能更強大的概念:Task。Task在線程池的基礎上進行了優化,並提供了更多的API。在FCL4.0中,如果我們要編寫多線程程序,Task顯然已經優於傳統的方式。
調用:
string id = "123456"; var tokenSource = new CancellationTokenSource(); var token = tokenSource.Token; token.Register(() => { Console.WriteLine("task任務取消"); }); var task = Task.Factory.StartNew(() => { Console.WriteLine("執行task任務"); //執行多任務方法 MainTaskWithParam(id, tokenSource); }, token);
業務方法:
private void MainTaskWithParam(string id, CancellationTokenSource tokenSource) { //業務邏輯代碼 --todo tokenSource.Cancel();//取消任務 }
總結: 實踐是檢驗真理的唯一標准。
參考:https://www.cnblogs.com/zhaoshujie/p/11082753.html