创建新计时器时,旧计时器会怎样?
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;
这将创建一个新的计时器,但当前的计时器永远不会被释放,因此它会继续运行 运行?最好的情况是停止。
哪个更好?
- 将计时器的创建移动到只调用一次的方法?
- 处理当前计时器,然后在 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
语句中的局部变量,正如您在其他答案中看到的那样。
如果您决定每个 class 使用一个计时器,那么您可以使用 Interval
属性 现有 Timer
实例设置间隔。使用此实现,您应该在包含 SendAndWait
方法的 class 上实现 IDisposable
,并将计时器放置在 class 的 Dispose
方法中。
我继承了一些旧代码,在我看来它的某些部分存在问题。
程序使用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;
这将创建一个新的计时器,但当前的计时器永远不会被释放,因此它会继续运行 运行?最好的情况是停止。
哪个更好?
- 将计时器的创建移动到只调用一次的方法?
- 处理当前计时器,然后在 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
语句中的局部变量,正如您在其他答案中看到的那样。
如果您决定每个 class 使用一个计时器,那么您可以使用 Interval
属性 现有 Timer
实例设置间隔。使用此实现,您应该在包含 SendAndWait
方法的 class 上实现 IDisposable
,并将计时器放置在 class 的 Dispose
方法中。