要写个程序持续的每秒ping一个IP用以监控网络,期间如果有没ping通的时候输出时间,用户结束程序时计算丢包率等。
源代码如下(做过简化),主要思路是通过timer计时器每秒调用theout方法,theout方法为ping指定IP 写完测试时发现有关内存方面的问题: 1.当ping1放在theout方法内,程序运行没有问题,但在.NET3.5下运行时内存会持续增加,而在4.0下运行内存则是不断循环变化,不知3.5和4.0为何有这区别? 2.当ping1放在theout方法外,如果从不丢包,则程序调试运行没问题,且不管是3.5还是4.0下运行内存都能维持在一个较低水平不变,貌似比较完美,但如果有ping不通的情况时就会出现调试错误,因为ping不通时该线程需要五秒左右才能结束,而下一秒一个新的线程又开始ping了,就会在“ping1.SendAsync(“127.0.0.1″, null);”这句报“异步调用已在进行中。必须先完成或者取消此调用,然后才能调用此方法。”错误(将IP改成任意ping不通的即可测试),不知这种情况有没有其他好的处理方法(当然不是1中的方法)。 内存变化情况如下: 框架_变量位置 开始运行时内存 运行1小时内存情况 3.5_in: 2,740K 240,000K左右,且一直持续增加,每秒增加几十K左右 3.5_out: 2,712K 3,400K,且几乎维持不变 4.0_in: 2,964K 循环变化,先每秒增加几十K到一定值(如31,000K)后回落(如4,700K),重复过程 4.0_out: 2,948K 3,580K,且几乎维持不变 源码如下: pre class=”brush: csharp”> using System; using System.Collections.Generic; using System.Text; using System.Net.NetworkInformation; namespace MemTest { class Program { Ping ping1 = new Ping();//如果将ping1放在theout方法外面,结果见3.5或4.0_out static void Main(string[] args) { Program p1 = new Program(); System.Timers.Timer t = new System.Timers.Timer(); //订阅t.Elapsed事件发生时执行theout方法 t.Elapsed += new System.Timers.ElapsedEventHandler(p1.theout); //间隔时间,毫秒 t.Interval = 1000; //设置是执行一次(false)还是一直执行(true); t.AutoReset = true; //是否执行System.Timers.Timer.Elapsed事件; t.Enabled = true; Console.Read(); } private void theout(object source, System.Timers.ElapsedEventArgs e) { //Ping ping1 = new Ping();//如果将ping1放在theout方法里面,结果见3.5或4.0_in ping1.SendAsync(“127.0.0.1”, null); } } } /pre> |
|
代码中需要释放的对象没有释放
但是不同的框架版本下效果不一样,也可能跟底层机制有关。 |
|
Ping ping1 = new Ping(); 放在外面,整个程序只有一个实例,所以占用的内存不会增加。
放到里面,那么每ping一次,内存里就多了一个新的对象,这样内存会占的越来越多。至于为什么不同版本的framework表现不一样,可能底层垃圾回收机制改了吧。 |
|
10分 |
局部变量是自动回收的,但是并不是马上就回收的,垃圾回收机制有一套算法来决定什么时候回收。因此局部变量不需要手动释放(仅限于托管代码)。 |
谢谢指教! |
|
逻辑问题
要么你上一次没ping通,不要进行下一次的ping 要么你将超时时间设置成1秒,而不是默认的4秒 |
|
这个问题已经比较明确了,确实就是这方面的问题,但需求就是想每秒ping一次,不知道3.5下面有没有好的方法,纠结 |
|
30分 |
那不是需求,而是拍脑袋想出来的方案 |
那不是需求,而是拍脑袋想出来的方案 |
|
程序里就一个timer每秒钟派一个人去啊,就极端情况考虑,一个一直都ping不通的IP,第1、2、3、4、5个人去都在那等,第6个人去的时候,第1个人因为超时就回来了,门卫那就剩2、3、4、5、6共五个人,第7个人去时第2个人也回来了,所以还是共5个人在门卫那,而且以后一直都是维持着五个人在等消息,不会出现越积越多的情况啊,不解。 |
|
嗯,确实应该这样考虑 |