【问题标题】:Windows forms timer not waiting for method to returnWindows 窗体计时器不等待方法返回
【发布时间】:2019-11-09 22:22:02
【问题描述】:

我的 Windows 窗体计时器有问题,它应该调用一个使用 Serial.ReadExisting() 从串行读取数据的方法。 当我的 com 端口尝试发送数据时,我经常会收到来自计时器的多个调用,这会将单个字符串分成多个字符串。 这让我很困扰,因为我在返回的字符串前面放了一个时间戳并将其附加到多行文本框。 定时器有什么方法可以等到方法完成读取传入数据而不必延迟/减慢我的定时器?

到目前为止我所拥有的:

private void loop_Tick(object sender, EventArgs e)
{
    AddToTextBox(Program.SerialReadLine());
}

public static string SerialReadLine()
{
    string read = _serialPort.ReadExisting();
    return read;
}

【问题讨论】:

    标签: c# forms winforms timer system.io.file


    【解决方案1】:

    您可以禁用计时器,拨打电话并再次启用它。

    private void loop_Tick(object sender, EventArgs e)
    {
        loop.Enabled = false;
        try
        {
            AddToTextBox(Program.SerialReadLine());
        }
        finally
        {
            loop.Enabled = true;
        }
    }
    

    【讨论】:

    • 或者在调用之间休眠的新线程中使用 while (true) { }。定时器的问题 Stop(), Start() 解决方案是,如果你从外部取消定时器,它仍然会完成它的循环并重新开始。所以我从外面做的是:loop = null。然后你的 finally { loop?.enabled = true; } 不会意外重启计时器。
    • 如何安全地调用其他线程的方法?有什么例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多