繁体   English   中英

创建新计时器时,旧计时器会怎样?

[英]When creating a new timer, what will happen to the old?

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

该程序使用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中创建一个新计时器?

我将计时器包装在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;
}

System.Timers.Timer的描述来看,它似乎是很沉重的对象,因此,每条消息初始化它都可能会产生很大的开销。 如果您觉得自己在性能方面苦苦挣扎,那么这里就是您要找的地方。 与方法的其余部分相比,您可以做一些微基准测试来计时计时器构造函数的执行时间。

在当前的实现中, retransmitTimer应该是using语句中包含的局部变量,如您在其他答案中所见。

如果决定每个类使用一个计时器,则可以使用现有Timer实例的Interval属性来设置时间间隔,而不必使用RetransmittInterval调用Timer构造函数。 使用此实现,您应该在包含SendAndWait方法的类上实现IDisposable ,并将计时器放置在您的类的Dispose方法中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM