C#多執行緒與多工
阿新 • • 發佈:2021-11-28
此處介紹了多執行緒和多工簡單使用:
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 = newobject();//非同步鎖,防止多個執行緒呼叫同一個方法,應對該方法不支援併發操作的情況 // 定義執行緒方法: 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; //使用者邏輯程式碼 --todoMonitor.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