[英]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;
這將創建一個新計時器,但是當前計時器永遠不會被丟棄,因此它將繼續運行嗎? 最好的情況將被停止。
什么是更好的?
我將計時器包裝在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.