程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 基礎才是重中之重~多線程的代價~我的內存都被吃了!,之重多線程

基礎才是重中之重~多線程的代價~我的內存都被吃了!,之重多線程

編輯: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;
                }
            }

查看一個任務管理器

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

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

 

感謝您的閱讀!

回到目錄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved