下表為多線程操作常見對象: object data = null; ThreadPool.QueueUserWorkItem((state) => { }, data); 高 獲取或設置一個布爾值,該值指示 System.Timers.Timer 是否應只引發一次 System.Timers.Tim ...
下表為多線程操作常見對象:
對象 | 方法/屬性 | 描述 | 用途 | 用法 | 性能 |
Thread(線程) | Start | 啟動線程,啟動後線程處於System.Threading.ThreadState.Running狀態 | 創建線程後,啟動 | new Thread(()=>{}).Start(); | 中 |
Sleep | 將當前線程掛起指定的毫秒數。 | 掛起當前線程1秒 | Thread.Sleet(1000) | ||
Abort | 中止當前線程 | 停止後續代碼運行 | Thread.CurrentThread.Abort() | ||
CurrentThread | 獲取當前線程對象 | 獲取當前線程對象 | Thread.CurrentThread | ||
CurrentPrincipal | 獲取或設置線程的當前負責人(對基於角色的安全性而言)。 | 可通過ClaimsPrincipal在當前線程中存儲相關申明,Abp中的DefaultPrincipalAccessor(IPrincipalAccessor)用來傳遞當前登陸人信息 | Thread.CurrentThread.ManagedThreadId | ||
ManagedThreadId | 獲取當前托管線程的唯一標識符。 | ||||
Task(任務) | Run | 將線上程池上運行的指定工作排隊,並返回 function 所返回的任務的代理項。 | Task.Run(()=>{}) | 高 | |
Delay | 創建一個在指定的時間間隔後完成的任務。 | Task.Delay(1000). | |||
WaitAll | 等待提供的所有 System.Threading.Tasks.Task 對象完成執行過程。 | 等待指定Task完成 | Task.WaitAll() | ||
WaitAny | 等待提供的任一 System.Threading.Tasks.Task 對象完成執行過程。 | 等待任一一個任務完成即執行後續操作 | Task.WaitAny() | ||
FromResult | 創建成功完成返回指定結果的任務 | 在非同步開發模式中,常用於返回一個成功的任務,以達到非同步調用的方式 | Task.FromResult(TResult) | ||
Task<TResult> | Result | 獲取此Task返回值 | |||
ThreadPool(線程池) | QueueUserWorkItem | 將方法排入隊列以便執行,並指定包含該方法所用數據的對象。 此方法在有線程池線程變得可用時執行。 |
object data = null; }, data); |
高 |
|
System.Timers.Timer(定時器),是對System.Threading.Timer封裝 | Start | 通過將 System.Timers.Timer.Enabled 設置為 true 開始引發 System.Timers.Timer.Elapsed 事件。 | 高 | ||
Stop | 通過將 System.Timers.Timer.Enabled 設置為 false 停止引發 System.Timers.Timer.Elapsed 事件。 | ||||
Close | 釋放由 System.Timers.Timer 占用的資源。 | ||||
AutoReset |
獲取或設置一個布爾值,該值指示 System.Timers.Timer 是否應只引發一次 System.Timers.Timer.Elapsed 事件((false) 或重覆 (true))。 |
應設置為true | |||
Enabled | 獲取或設置一個值,該值指示 System.Timers.Timer 是否應引發 System.Timers.Timer.Elapsed 事件。 | 應設置為true | |||
Interval | 獲取或設置引發 System.Timers.Timer.Elapsed 事件的間隔(以毫秒為單位)。 | ||||
System.Threading.Timer(定時器) |
高 |
1、Thread(線程)
原生的線程對象,性能相對較低,無法共用現有線程。每次都會創建一個新的線程,涉及到線程的銷毀、創建,所以性能相對較低。不建議使用;
示例:
1 public void TestThread() 2 { 3 var thread = new Thread(() => 4 { 5 Console.WriteLine($"3、Async Current Thread Id={Thread.CurrentThread.ManagedThreadId.ToString("00")} Thread State={Thread.CurrentThread.ThreadState.ToString()}"); 6 }); 7 Console.WriteLine($"1、Async Current Thread Id={Thread.CurrentThread.ManagedThreadId.ToString("00")} Thread State={thread.ThreadState.ToString()}"); 8 thread.Start(); 9 Console.WriteLine($"2、Async Current Thread Id={Thread.CurrentThread.ManagedThreadId.ToString("00")} Thread State={thread.ThreadState.ToString()}"); 10 Thread.Sleep(1000); 11 Console.WriteLine($"4、Async Current Thread Id={Thread.CurrentThread.ManagedThreadId.ToString("00")} Thread State={thread.ThreadState.ToString()}"); 12 Console.WriteLine(Thread.GetDomainID()); 13 }
2、Task(任務)
官方文檔:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.tasks.task?view=netframework-4.7.2
Task是對ThreadPool的封裝,支持等待,不直接創建線程和銷毀線程,由ThreadPool管理創建和銷毀。建議使用;
示例:
public void TestTask() { Console.WriteLine($"Async Current Thread Id={Thread.CurrentThread.ManagedThreadId}"); var tasks = new List<Task>(100); for (var i = 0; i < 10; i++) { RunTask(i); } } private Task RunTask(int i) { return Task.Run(() => { Console.WriteLine($"Sync Current Thread Id={Thread.CurrentThread.ManagedThreadId.ToString("00")} i={i.ToString("00")}"); }); }
3、ThreadPool(線程池)
官方文檔:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.threadpool?view=netframework-4.7.2
類似與ADO.NET資料庫連接池,出發點都是用於統一管理線程的創建和銷毀。如果非同步任務不需要等待建議使用;
示例:
public void TestThreadPool() { object data = null; ThreadPool.QueueUserWorkItem((state) => { Console.WriteLine($"Sync Current Thread Id={Thread.CurrentThread.ManagedThreadId.ToString("00")} i={i.ToString("00")}"); }, data); }
4、System.Timers.Timer定時器
System.Threading.Timer官方文檔:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.timer?view=netframework-4.7.2
System.Timers.Timer官方文檔:https://docs.microsoft.com/zh-cn/dotnet/api/system.timers.timer?view=netframework-4.7.2
System.Timers.Timer定時器是對System.Threading.Timer封裝,更加方便使用,使用那個看個人習慣;
示例:
public void TestTimer() { var hubTimer = new System.Timers.Timer(10 * 1000) { AutoReset = true, Enabled = true, }; hubTimer.Elapsed += Run;//註冊事件 hubTimer.Elapsed -= Run;//取消事件 hubTimer.Start(); } public void Run(object sender, ElapsedEventArgs e) { }