C#管理大量耗时的线程,内存占用严重
我水平有限,在socket方面不在行,一直让我对socket没信心的是两个方面,第一:socket异常时有些捕获不到,就是没法准确判断连接是否已经断开;第二:重点,就是每...
我水平有限,在socket方面不在行,一直让我对socket没信心的是两个方面,
第一:socket异常时有些捕获不到,就是没法准确判断连接是否已经断开;
第二:重点,就是每个客户端连接过来的时候都需要开辟一个新的线程去处理客户发来的消息,如果客户过多势必导致线程数量不断增加,内存也会飙升,怎么有效的管理这些线程,让内存更加稳定呢, 或者说就socket这块大量用户连接的时候有没有更好的处理方法, 线程池不适合用来做耗时的任务,大家懂的 展开
第一:socket异常时有些捕获不到,就是没法准确判断连接是否已经断开;
第二:重点,就是每个客户端连接过来的时候都需要开辟一个新的线程去处理客户发来的消息,如果客户过多势必导致线程数量不断增加,内存也会飙升,怎么有效的管理这些线程,让内存更加稳定呢, 或者说就socket这块大量用户连接的时候有没有更好的处理方法, 线程池不适合用来做耗时的任务,大家懂的 展开
3个回答
展开全部
在你的表述中,“线程池不适合用来做耗时的任务”是最大误区
1)你一定看到过System.Net.Socket类中有很多BeginXXX / EndXXX的方法,例如Socket.BeginReceiveFrom和Socket.EndReceiveFrom,这些函数统称为异步函数。而异步函数操作的基础恰恰就是线程池。对Socket通信而言,微软提供的异步操作正是利用线程池中I/O线程,目的就是为了提高Socket I/O性能并简化内存管理的!
2)如果对异步操作感到头晕,在处理Socket操作时可以使用“显式线程”方法,即按以下方法启动处理线程:
System.Thread t = new System.Thread(你的处理函数);
t.IsBackground = true; //这个设置尤其重要!!!!!
t.Start();
一定要注意将线程设置为后台线程!
3)你一定知道系统每次启动线程和销毁线程时都会导致很大的开销。当你的程序频繁的启动、销毁线程,必然会导致程序很“卡”;正是由于这个缘故,微软才搞了一个“线程池”。因为线程中的线程都是“启动完毕的”(这样表述虽不确切,但没有错),一旦你将异步处理函数“挂接”的线程池中的空闲线程上即可以执行你要的操作。而且,额外的好处是你根本不用去管理线程池中的线程(真正的“零”管理)
4)处理“耗时的操作”特别是涉及诸如Socket I/O 耗时操作,最佳的处理方法是利用后台线程(如果需要,同时配合以自定义事件event),这是增加用户体验不二法门哦~~
1)你一定看到过System.Net.Socket类中有很多BeginXXX / EndXXX的方法,例如Socket.BeginReceiveFrom和Socket.EndReceiveFrom,这些函数统称为异步函数。而异步函数操作的基础恰恰就是线程池。对Socket通信而言,微软提供的异步操作正是利用线程池中I/O线程,目的就是为了提高Socket I/O性能并简化内存管理的!
2)如果对异步操作感到头晕,在处理Socket操作时可以使用“显式线程”方法,即按以下方法启动处理线程:
System.Thread t = new System.Thread(你的处理函数);
t.IsBackground = true; //这个设置尤其重要!!!!!
t.Start();
一定要注意将线程设置为后台线程!
3)你一定知道系统每次启动线程和销毁线程时都会导致很大的开销。当你的程序频繁的启动、销毁线程,必然会导致程序很“卡”;正是由于这个缘故,微软才搞了一个“线程池”。因为线程中的线程都是“启动完毕的”(这样表述虽不确切,但没有错),一旦你将异步处理函数“挂接”的线程池中的空闲线程上即可以执行你要的操作。而且,额外的好处是你根本不用去管理线程池中的线程(真正的“零”管理)
4)处理“耗时的操作”特别是涉及诸如Socket I/O 耗时操作,最佳的处理方法是利用后台线程(如果需要,同时配合以自定义事件event),这是增加用户体验不二法门哦~~
更多追问追答
追问
就是说 在简单的Socket编程中,用户进入跟处理用户信息全部用异步来操作是吗,不需要用“显式线程”来处理么? 这样做仅仅是为了让系统自动回收垃圾吗 还是有别的好处?
另外在别的地方看到异步处理是不是有个数限制,比如能异步接收64个客户进入,
追答
你说的 "用户进入跟处理用户信息"中的用户信息是通过Socket传递的吗?如果是,在异步回调中处理 。总之,涉及到Socket的操作均采用异步处理或后台线程处理。
曾经编写一个Socket UDP程序,同时处理1000多个客户端,双核CPU,2G内存。运行过程中CPU平均占用率不超过12%
展开全部
Windows下参考完全端口,也叫iocp;Linux下参见Epoll
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的问题涉及很多方面。帮你清理一下,
socket 的追踪问题,没法准确判断连接是否已经断开,今天技术问题很容易解决。
多线程问题,每个客户端连接过来的时候都需要开辟一个新的线程去处理客户发来的消息。
耗时的任务, 感觉关键在于耗时的任务,因为耗时的线程确实会很快消耗掉所有的线程池。
首先,耗时是什么造成的,如果是硬盘读写,能否用cache解决?如果是网络问题,能否call back? 如果是数据库问题,能否用cluster?如果是CPU问题,能否采用web farm?
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |