基礎才是重中之重~多線(xian)程(cheng)的(de)代價(jia)~我的(de)內存(cun)都被吃(chi)了!
異步(bu)操作是.net4.5推出的新名詞,事實上,這東西早就有(you)了,它歸根結底是通過線(xian)(xian)程池來實現(xian)的,即將一個大任務分成(cheng)(cheng)多(duo)個小(xiao)任何塊,每個線(xian)(xian)程并(bing)行(xing)處(chu)理其中的一個,完成(cheng)(cheng)后(hou)再把結果(guo)告訴主線(xian)(xian)程,在.net4.5推出后(hou),這種(zhong)技術得(de)到了封裝,讓(rang)開(kai)發人員實現(xian)起來更加方便了,但是,并(bing)發(導步(bu),多(duo)線(xian)(xian)程)并(bing)不(bu)是在哪里都(dou)適用(yong)的,使(shi)用(yong)不(bu)當,可能出現(xian)很多(duo)嚴重的后(hou)果(guo)!
看我的程序,這家伙已經占到了2.6G的內存(cun)空間了,很可怕吧!
出現這種問題的原因就是我沒有把線程這東西搞清楚,在一個調用密集的環境里,使用了多線程,要知道,這種線程,線程池里會有N多個線程的,處理的速度我沒有覺得提升,反而內存吃的很嚴重,這個原(yuan)因就是因為你的工作(zuo)線程太多(duo)的緣故(gu)。
所以(yi),多線程,并行,異步(bu)這些(xie)東西不是在哪都適(shi)用(yong)的,在調用(yong)密集時就能用(yong)它(ta),因為它(ta)會吃你(ni)(ni)很多內存,如果非要用(yong),請(qing)你(ni)(ni)把線程池的最大數限制(zhi)(zhi)一下,這個值可以(yi)控制(zhi)(zhi)在10以(yi)內。
下面是多線程吃(chi)內存的例子
while (true) { // ThreadPool.SetMaxThreads(10, 10);//限(xian)制最大工作線程(cheng)和i/o線程(cheng) 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; } }
查看一個任務管理器
當我(wo)把(ba)工作(zuo)線程做了(le)限制后,這種(zhong)情況得到了(le)改善
而如果(guo)對于操(cao)作頻繁(輪訓服務(wu))的(de)工作,如果(guo)不(bu)使用多線程,反而(er)根(gen)據不(bu)吃什么內存,性能反而(er)更好(hao)!
感謝您的閱讀!