背景
之前接手一個專案的時候,發現到處是
new Thread(()=>{
//do something
}).Start();
這么做的目的,無非是為了減少頁面等待時間提高用戶體驗,把一些浪費時間的操作放到新執行緒中在后臺運行,
問題
但是這樣帶來的問題是大量的創建執行緒,非常影響專案的性能,尤其是在一些大并發量訪問的時候,經常導致后果是cpu 100%,
當然,如果你的專案到處是這樣寫的,然后,沒掛,至少說明這個方法沒幾個人再用,
解決方法
于是下意識的想著給專案優化下, 第一想法是走佇列,但是發現專案壓根沒有使用佇列,很多操作還停留在 有個任務表,有任務的時候,往里面加內容,然后有個定時任務,每分鐘執行一次,定時的去消費任務;
于是想著怎么先最少的改動,先把問題解決,后面的事情在做考慮,
其實問題的本質是new 太多Thread了,那么最簡單的方法就是限制數量,
于是 ThreadPool.QueueUserWorkItem就登場了,
對于執行緒佇列 ThreadPool.QueueUserWorkItem 很多人應該都不陌生,下邊看微軟的解釋:
將方法排入佇列以便執行,并指定包含該方法所用資料的物件,此方法在有執行緒池執行緒變得可用時執行,
方法如下
protected static Logger Logger = LogManager.GetCurrentClassLogger(); public ActionResult Index() { // Logger.Debug("執行了 開始 "); ThreadPool.QueueUserWorkItem(new WaitCallback(InsertNewsInfoExt), "param"); // Logger.Debug("執行了 結束 "); return View(); } private void InsertNewsInfoExt(object info) { // Logger.Debug("執行了 InsertNewsInfoExt 開始"); Thread.Sleep(1000*200); Logger.Debug("執行了 InsertNewsInfoExt 結束 "); new Thread(t => { try { Logger.Debug("執行了 Thread "); } catch (Exception ex) { Logger.Error(ex.Message); } }).Start(); }
根據msdn描述:執行緒池的默認大小為每個可用處理器有 25 個執行緒,使用 SetMaxThreads 方法可以更改執行緒池中的執行緒數
//作業者執行緒最大數目,I/O執行緒的最大數目 ThreadPool.SetMaxThreads(1000, 1000); //啟動作業者執行緒 ThreadPool.QueueUserWorkItem(new WaitCallback(InsertNewsInfoExt), "param");
相關引數
GetAvailableThreads 剩余空閑執行緒數
GetMaxThreads 最多可用執行緒數,所有大于此數目的請求將保持排隊狀態,直到執行緒池執行緒變為可用
GetMinThreads 檢索執行緒池在新請求預測中維護的空閑執行緒數,
QueueUserWorkItem 啟動執行緒池里得一個執行緒(佇列的方式,如執行緒池暫時沒空閑執行緒,則進入佇列排隊)
SetMaxThreads 設定執行緒池中的最大執行緒數
SetMinThreads 設定執行緒池最少需要保留的執行緒數
這樣就解決了無限制 new Thread 的問題,實作了最少改動,
UP技術控 江東子弟多才俊,卷土重來未可知,——唐·杜牧 481篇原創內容 公眾號
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/417018.html
標籤:.NET技术
下一篇:使用 WPF 做個 PowerPoint 系列 文本 BodyProperties 的 FontScale 與文本字號縮放
