.net Parallel並行使用注意事項


因項目響應過慢,代碼優化空間不大,在暫時無法調整系統架構的情況下,只有使用.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的情況。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM