我继承了一些旧代码,在我看来它的某些部分存在问题。
该程序使用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;
这将创建一个新计时器,但是当前计时器永远不会被丢弃,因此它将继续运行吗?最好的情况是它将停止。
有什么更好的?
答案 0 :(得分:2)
我将计时器包裹在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;
}
答案 1 :(得分:0)
从System.Timers.Timer的描述来看,它似乎是很沉重的对象,因此在每条消息中初始化它可能会有相当大的开销。如果您觉得自己在性能方面苦苦挣扎,那么这里就是您要找的地方。与方法的其余部分相比,您可以做一些微基准测试来计时计时器构造函数的执行时间。
在当前的实现中,retransmitTimer
应该是包含在using
语句中的局部变量,如您在其他答案中所见。
如果决定每个类使用一个计时器,则可以使用现有RetransmittInterval
实例的Interval
属性来设置时间间隔,而不必使用Timer
调用Timer构造函数。通过此实现,您应该在包含IDisposable
方法的类上实现SendAndWait
,并将计时器放置在您类的Dispose
方法中。