C# .NET Framework 4.7.2如何实现可再次延期的延迟执行方法?
实现方案
推荐使用System.Windows.Forms.Timer实现,该计时器原生运行在UI线程,触发事件时可直接操作WinForms控件,无需额外跨线程处理,完全匹配你的需求。
完整实现代码
1. 定义类成员
// 串口接收数据缓冲区 private string _serialPortCurrentReceivedDataBuffered = string.Empty; // 延迟执行计时器 private System.Windows.Forms.Timer _dataProcessTimer;
2. 初始化计时器(窗体构造函数/Load事件中添加)
public YourFormName() { InitializeComponent(); // 初始化延迟处理计时器 _dataProcessTimer = new System.Windows.Forms.Timer(); _dataProcessTimer.Interval = 200; // 配置默认延迟时长 _dataProcessTimer.Tick += DataProcessTimer_Tick; }
3. 串口接收事件处理
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { string receivedData = ((SerialPort)sender).ReadExisting(); _serialPortCurrentReceivedDataBuffered += receivedData; // DataReceived事件在非UI线程触发,需要封送到UI线程操作计时器 if (this.InvokeRequired && !this.IsDisposed && !this.Disposing) { this.Invoke(new Action(() => { // 停止后重启计时器,等价于重置延迟时间 _dataProcessTimer.Stop(); _dataProcessTimer.Start(); })); } else { _dataProcessTimer.Stop(); _dataProcessTimer.Start(); } }
4. 延迟执行的业务处理方法
private void DataProcessTimer_Tick(object sender, EventArgs e) { // 停止计时器避免重复触发 _dataProcessTimer.Stop(); string receivedData = _serialPortCurrentReceivedDataBuffered; _serialPortCurrentReceivedDataBuffered = string.Empty; // 此处直接编写数据处理逻辑,可直接操作UI控件,无需额外跨线程处理 // 示例:textBox_Receive.Text = receivedData; }
方案说明
- 每次串口收到数据都会重置计时器,只要200ms内有新数据到达就会持续推迟处理,直到数据传输完全停止200ms后才会执行业务逻辑,完全符合你的需求
- 要调整延迟时长直接修改
_dataProcessTimer.Interval属性即可 - 如果需要处理二进制串口数据,可将缓冲区类型替换为
List<byte>,避免字符串编码导致的数据丢失
内容的提问来源于stack exchange,提问作者Pavel Emelyanov
相关产品推荐
相关产品推荐

