解决方案 »
- c# 导出word内在不足,请现在保存文档
- C#中如何对datagridview中的数据直接进行操作
- sql 查询datetime类型,时区问题
- 谁会dataGridView或UltraGrid制作这样的表(2)?
- 为什么装了VS.NET2005,即没有新建WEB应用程序项目选项?
- 窗体参数传递问题!!高手指点!!!
- 蛮长的代码有很小的错误
- 有没有人能知道我做一下用C#做计算器 然后后写项目报告的 我的QQ是331638432 谁会救教我一下
- c#读取GPS串口信息的问题
- 用MapXtreme时,碰到标注点的位图颜色问题,HELP!
- 一个dataTable里已有数据,怎么按字段排序呢?
- C# PDF 源文件分析+中英文本提取
{
pingSender.PingCompleted += new PingCompletedEventHandler(pingSender.PingCompletedCallBack);
pingSender.SendAsync(args[0], timeout, buffer, null);
}你把事件在外面加。
在循环里面+= 造成最后事件数量是1000*1000个。
我观察了进程管理器里面的线程数,线程数没有增加多少(没运行前1600多个线程,运行后 1900多个线程),也就增加了不到400个线程,系统完全能扛得住,问题是里面的那个句柄数增加太多了,没运行前句柄数10万多一点,运行后句柄数就一直增加,最后 90万都不止,明显 C#对ping 类里面的资源释放是有问题的
我写个循环只是为了让问题更容易出现,我曾经在循环里用sleep,或者写个界面弄个定时器,系统经过一定时间后,内存仍然是只增不减的,所以这个跟是否并发应该没有多大关系吧
用你说的也是一种解决方案。
不过如果不用ping 类的异步模式,我也没有内存增长的问题。而且用重定向还是没有直接这么用简单。
如果想讨论所谓“资源释放”有问题,你首先把Ping的Dispose源代码贴出来。它也不过做了7、7条代码而已嘛。既然你去分析它,就不要总是议论,应该围绕源代码来讨论。
我ping 的是局域网的网关,而且网络是通路,没有你说的对方不在线的问题。
而且我今天再做,发现只要减少那个超时值为100或者更小,即使就是网络不通,内存根本就不是问题(内存已经增长极其缓慢了,抗住那个1000*1000循环绝对没问题)。 问题还是那个句柄数,句柄数的增加跟内存的增加成正比,也就是说我如果再增加一层1000的循环,内存是因为句柄数的增加而耗尽
我是怀疑ping 的 “资源释放”有问题,ping 的资源释放的代码在debug模式下跟不出来。
对于LZ千万级的实例,系统除了每个线程都要进入Ping等待返回,另一方面还需要维护这个队列,也许CPU占用并不会太高,但是系统能使用的TCP连接/半连接数是有限的,远远小于并发线程数自己想想吧
因为,嘴巴,食道,胃,大肠,不是一样的粗计算机里,程序,网卡,内存硬盘
类似的问题还出现在,并发处理大量小文件的时候,如果不控制并发量,我的电脑上10分钟后会内存耗尽异常
解决方法因为我用的是 并行 foreach 只需要设定最大并发量 maxdegreeofparallelism 就没有问题
(sender as IDisposable).Dispose();改成(sender as Ping).Dispose();,这是问题所在