【问题标题】:C# Windows Service memory leak timer and pingC# Windows 服务内存泄漏计时器和 ping
【发布时间】:2013-08-14 13:18:21
【问题描述】:

我正在创建一个带有引擎和 asp.net 客户端界面的应用程序。目前我正在监视服务器是否可以通过 ping 访问。在每个滴答声中,计时器都会调用一些类并为 _evmComputerEntries 中的每个服务器执行 IsAlive (ping)

我有一个计时器(测试和故障排除间隔 5 秒)

Timer timer = new Timer(5000);
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Enabled = true;

public void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        _BLComputerStatus.Open();
        foreach (evmComputerEntry evmComputerEntry in _evmComputerEntries)
        {
            //eventLogEVMON.WriteEntry(DateTime.Now.ToString());
            evmComputerStatus evmComputerStatus;
            if (IsAlive(evmComputerEntry.ComputerName))
            {
                evmComputerStatus = new evmComputerStatus(0, evmComputerEntry.ComputerEntryId, 1, DateTime.Now);
            }
            else
            {
                evmComputerStatus = new evmComputerStatus(0, evmComputerEntry.ComputerEntryId, 0, DateTime.Now);
            }
            _BLComputerStatus.InsertComputerStatusEntry(evmComputerStatus);
        }
        _BLComputerStatus.Close();
    }

因为我调用了一个Open和Close函数来打开和关闭SQL连接,我想应该没有问题吧?

这是 IsAlive 函数:

public bool IsAlive(string server)
    {
        bool result = false;
        try
        {
            Ping pingSender = new Ping();
            PingOptions options = new PingOptions();
            options.DontFragment = true;
            string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
            byte[] buffer = Encoding.ASCII.GetBytes(data);
            int timeout = 120;
            PingReply reply = pingSender.Send(server, timeout, buffer, options);
            if (reply.Status == IPStatus.Success)
                result = true;
        }
        catch
        {
            result = false;
        }
        return result;
    }

evmComputerStatus:

    private int computerStatusId, status;
    private string computerEntryId;
    private DateTime statusTime;

    public evmComputerStatus(int ComputerStatusId, string ComputerEntryId, int Status, DateTime StatusTime)
    {
        this.computerStatusId = ComputerStatusId;
        this.computerEntryId = ComputerEntryId;
        this.status = Status;
        this.statusTime = StatusTime;
    }

【问题讨论】:

  • 问题出在哪里?
  • 向我们展示 evmComputerStatus 构造函数的作用。
  • 当我监控我的服务时,内存不断增长
  • Ping 实现 IDisposable。你应该处理它。

标签: c# memory memory-leaks timer


【解决方案1】:

你应该处理 Ping

public bool IsAlive(string server)
    {
        bool result = false;
        try
        {
            using (Ping pingSender = new Ping()) {
                PingOptions options = new PingOptions();
                options.DontFragment = true;
                string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
                byte[] buffer = Encoding.ASCII.GetBytes(data);
                int timeout = 120;
                PingReply reply = pingSender.Send(server, timeout, buffer, options);
                if (reply.Status == IPStatus.Success)
                    result = true;
            }
        }
        catch
        {
            result = false;
        }
        return result;
    }

【讨论】:

  • 非常感谢您的分配,是 ping 增加了我的记忆力,但我认为还有其他一些东西可以慢慢增加我的记忆力。我会搜索这个,如果需要,我会回来。
  • @Andy- 缓慢的内存增加并不总是意味着由于垃圾收集的工作方式而导致内存泄漏。但是最好在您创建实现 IDisposable 的对象的其他地方搜索您的代码。尤其是这种情况,因为您正在执行 I/O,并且许多与之相关的类都实现了 IDisposable。
猜你喜欢
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2018-01-25
  • 2017-08-30
相关资源
最近更新 更多