回到目錄
異步操作是.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; } }
查看一個任務管理器
當我把工作線程做了限制後,這種情況得到了改善
而如果對於操作頻繁(輪訓服務)的工作,如果不使用多線程,反而根據不吃什麼內存,性能反而更好!
感謝您的閱讀!
回到目錄