簡體   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