c# - 创建新计时器时,旧计时器会发生什么?
问题描述
我继承了一些旧代码,在我看来,它的某些部分存在问题。
该程序使用 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;
}
推荐阅读
- css - 是否有可能在 SASS 中使用 CSS 变量?
- php - 如何使新创建的类别自动设置为 wordpress 中的主要导航菜单?
- java - 使用 Spring Boot 在 HTML 页面中显示表格
- html - 底部的 Flexbox 图像间隙
- python - 虚拟机器人 random.choices 和 os.startfile()
- python - 我的pyserial有什么问题?我已经使用 pip 安装了 py serial
- python - mysql 连接器。'chunk = self.sock.recv(4 - packet_len)' 的无限等待
- javascript - 是否有针对 XSD 1.1 版本验证 XML 的 JavaScript 库?
- c - 从plugin_path返回局部变量我如何改变它
- typescript - @types/react-table:如何为我的包的用户包含配置的类型?