这几天在做windows服务这块,涉及到SOCKET和多线程问题,功能都已经实现了的,不过在调试的时候发现,服务不管在用不用就是无伦什么时候,始终占了很多CPU,25%。着实吓了一跳。后来想一想,主要是一个监听子线程一直在后台运行,片刻也不休息一下,不管有没有任务请求他一直都在跑。这样不累才怪了。
所以,解决办法也很简单,可以说是灰常的简单就是在循环监听的时候,偶尔休息一下。
Thread.Sleep(10);
一句话搞定,这样线程会不间断的休息一会,忙里偷闲一下,这时再调试,后台CPU占有率为0,当然实在不用的情况下哈。。
.NET相爱,一个子线程在不做任何控制,一直运行下,基本都是占25%的cpu,这样随便开几个线程,你的cpu就爆了。。。
还有一个问题,功能不是特备复杂的服务,对于内存的开销比较大,测试时候最大60M多的占有量。
解决办法,调用WIN32函数,释放内存,结果是,内存占有量锐减,少了很多,不过而已带了一个问题,性能上有点影响,不过不大。。
[DllImport("kernel32.dll")]
private static extern int SetProcessWorkingSetSize(IntPtr hProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);
调用这个函数:SetProcessWorkingSetSize 在C++里面
BOOL SetProcessWorkingSetSize( HANDLE hProcess, SIZE_TdwMinimumWorkingSetSize, SIZE_TdwMaximumWorkingSetSize);
HANDLE hProcess 一个进程的句柄 ,下面的就是该进程的最小最大内存。是可以设置的。。
为了达到释放内存最大化的效果,参数都是 -1,-1并不代表一点内存也没有,是最小、、
如此调用:SetProcessMemoryToMin(Process.GetCurrentProcess().Handle);
很简单也很方便的,会让你的程序更节省资源。。
多线程程序占用CPU过多的问题
最新推荐文章于 2024-08-17 23:25:59 发布