C# 多線程的代價~內存都被吃了!


 

異步操作是.net4.5推出的新名詞,事實上,這東西早就有了,它歸根結底是通過線程池來實現的,即將一個大任務分成多個小任何塊,每個線程並行處理其中的一個,完成后再把結果告訴主線程,在.net4.5推出后,這種技術得到了封裝,讓開發人員實現起來更加方便了,但是,並發(導步,多線程)並不是在哪里都適用的,使用不當,可能出現很多嚴重的后果!

看我的程序,這家伙已經占到了2.6G的內存空間了,很可怕吧!

出現這種問題的原因就是我沒有把線程這東西搞清楚,在一個調用密集的環境里,使用了多線程,要知道,這種線程,線程池里會有N多個線程的,處理的速度我沒有覺得提升,反而內存吃的很嚴重,這個原因就是因為你的工作線程太多的緣故

所以,多線程,並行,異步這些東西不是在哪都適用的,在調用密集時就能用它,因為它會吃你很多內存,如果非要用,請你把線程池的最大數限制一下,這個值可以控制在10以內。

下面是多線程吃內存的例子

復制代碼
          while (true)
            {
               // ThreadPool.SetMaxThreads(10, 10);//限制最大工作線程和i/o線程
                ThreadPool.QueueUserWorkItem(new WaitCallback((a) =>
                {
                    ConcurrentDictionary<string, SendingResult> test2 = new ConcurrentDictionary<string, SendingResult>();
                    test2.TryAdd(Guid.NewGuid().ToString(), new SendingResult
                     {
                         BatchNumber = Guid.NewGuid().ToString(),
                         DbName = "zzl",
                         EndId = 1,
                         StartId = 1,
                         TableName = "zzl",
                         OccurDate = DateTime.Now,
                     });
                }));

                if (DateTime.Now.Minute == 02)
                {
                    break;
                }
            }
復制代碼

查看一個任務管理器

當我把工作線程做了限制后,這種情況得到了改善

如果對於操作頻繁(輪訓服務)的工作,如果不使用多線程,反而根據不吃什么內存,性能反而更好!

 

 

 
 


免責聲明!

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



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