多线程程序占用CPU过多的问题

来源:互联网 发布:全民飞机巅峰飞跃算法 编辑:程序博客网 时间:2024/05/01 16:29

这几天在做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);

很简单也很方便的,会让你的程序更节省资源。。

原创粉丝点击