菜鸟讨教有关程序运行时内存占用方面的问题

.Net技术 码拜 8年前 (2016-05-24) 866次浏览
C#刚开始学小白,讨教几个问题,请前辈指点,多谢!
要写个程序持续的每秒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,且几乎维持不变
源码如下:

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);
        }
    }
}
解决方案

10

引用:

怎么释放?局部变量不是自动回收的吗,方法内部的实例能否需要手动释放?请指点

局部变量是自动回收的,但是并不是马上就回收的,垃圾回收机制有一套算法来决定什么时候回收。因此局部变量不需要手动释放(仅限于托管代码)。

30

引用:
Quote: 引用:

逻辑问题
要么你上一次没ping通,不要进行下一次的ping
要么你将超时时间设置成1秒,而不是默认的4秒

这个问题已经比较明确了,确实就是这方面的问题,但需求就是想每秒ping一次,不知道3.5下面有没有好的方法,纠结

那不是需求,而是拍脑袋想出来的方案
好比今天有快递要来,你就派个人不断的去门卫看能否来了快递
然后你说:需求就是每隔10分钟派个人过去,而不管前面派出的人能否还在那里根本没有走开?
前一次正在ping,没有超时,你另开个线程继续ping是没有任何意义的
就好比已经有个人在门卫等快递了,你再派一个人去看,该来还是会来,该不来还是不来,没有任何意义
所以,假如想避免门卫挤了一堆人在那等快递
1.要么写个异步回调方法,让门卫接到快递给你打电话,而不是你不断派人去看
2.要么前面的人没走之前,就不要再派其他人去
3.要么让前面的人看一眼,没有就赶紧回来,而不是一直在那等


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明菜鸟讨教有关程序运行时内存占用方面的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)