基础才是重中之重~多线程的代价~我的内存都被吃了!
异步操作是.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; } }
查看一个任务管理器
当我把工作线程做了限制后,这种情况得到了改善
而如果对于操作频繁(轮训服务)的工作,如果不使用多线程,反而根据不吃什么内存,性能反而更好!
感谢您的阅读!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2014-03-11 MVVM架构~knockoutjs系列之从Knockout.Validation.js源码中学习它的用法
2013-03-11 数据结构~站点地图其实是一颗树