因項目響應過慢,代碼優化空間不大,在暫時無法調整系統架構的情況下,只有使用.NET中的TPL解決一些模塊耗時過多的問題。但在使用過程中也碰到了一些問題,現在把它寫下來,用於備忘。
1. Parallel.ForEach的使用
1 static void Main(string[] args) 2 { 3 //Test(); 4 TestParllel(); 5 Console.ReadLine(); 6 } 7 8 private static void TestParllel() 9 { 10 var list = new List<int>(6000); 11 12 for (int i = 0; i < 6000; i++) 13 { 14 list.Add(i); 15 } 16 Parallel.ForEach(list, (p, state) => { Invoke(p); }); 17 } 18 19 static void Invoke(int i) 20 { 21 Console.WriteLine(Thread.CurrentThread.ManagedThreadId); 22 Thread.Sleep(30000); 23 }
未設置最大線程數的情況下:
a>為設置最大線程的情況下,TPL默認線程數為任務數(系統允許的情況下,設置ThreadPool.SetMaxThreads沒有效果)。
b> TPL默認啟動5個線程,任務數小於5的話,啟動任務數個線程。
c> 如果任務較多,TPL在初始化5個線程后,每隔100毫秒左右新增線程,直到達到最大線程數。如果新增線程的過程中有任務完成,那么就不會新增線程。
缺點:線程數無法控制,容易造成高CPU,系統失去響應。
設置了最大線程數的情況下:
1 private static void TestParllel() 2 { 3 var list = new List<int>(6000); 4 5 for (int i = 0; i < 6000; i++) 6 { 7 list.Add(i); 8 } 9 Parallel.ForEach(list, new ParallelOptions { MaxDegreeOfParallelism = 2}, (p, state) => { Invoke(p); }); 10 }
設置了最大線程數為2
a> 系統運行可控,不會造成高CPU的情況。
