You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:54:04