首页 > 解决方案 > 创建新计时器时,旧计时器会发生什么?

问题描述

我继承了一些旧代码,在我看来,它的某些部分存在问题。

该程序使用 TCP/IP 与另一个程序通信,协议简单。发送命令电报并等待响应电报。

这是我认为有问题的部分。

public System.Timers.Timer retransmitTimer;

public TelegramBase SendAndWait(TelegramBase telegram)
{
    CurrentTelegram = telegram;

    retransmitTimer = new Timer(RetransmitInterval);
    retransmitTimer.Elapsed += retransmitTimer_Elapsed;

    //Send telegram
    Send(telegram);

    //Start timer
    retransmitTimer.Start();

    //Wait for response
    var response = WaitForResponse(telegram as StandardTelegram);

    //stop timer
    retransmitTimer.Stop();

    return response;
}

每次发送命令电报时都会调用方法 SendAndWait。

我的问题是计时器的创建

    retransmitTimer = new Timer(RetransmitInterval);
    retransmitTimer.Elapsed += retransmitTimer_Elapsed;

这将创建一个新的计时器,但当前的计时器永远不会被释放,所以它会继续运行?最好的情况是它会停止。

什么是更好的?

  1. 将计时器的创建移动到只调用一次的方法?
  2. 处置当前计时器,然后在 SendAndWait 中创建一个新计时器?

标签: c#system.timers.timer

解决方案


我会将计时器包装在一个using语句中:

public TelegramBase SendAndWait(TelegramBase telegram)
{
    CurrentTelegram = telegram;

    using (Timer retransmitTimer = new Timer(RetransmitInterval))
    {
        retransmitTimer.Elapsed += retransmitTimer_Elapsed;

        //Send telegram
        Send(telegram);

        //Start timer
        retransmitTimer.Start();

        //Wait for response
        var response = WaitForResponse(telegram as StandardTelegram);

        //stop timer
        retransmitTimer.Stop();
    }

    return response;
}

推荐阅读