【问题标题】:C# text box latencyC# 文本框延迟
【发布时间】:2016-04-19 16:27:24
【问题描述】:

我正在将来自惯性传感器的数据流式传输到 C# 应用程序中。使用 bool 作为开关,我将传入的值打印到一系列文本框中,如下所示:

    if (bStreaming == true)
    {
     textboxTX.Invoke(new Action(() => textboxTX.Text = Convert.ToString(result[0])));
     textboxTY.Invoke(new Action(() => textboxTY.Text = Convert.ToString(result[1])));
     textboxTZ.Invoke(new Action(() => textboxTZ.Text = Convert.ToString(result[2])));
    }

问题是,一旦我开始这个循环,我的应用程序的其余部分就会大大减慢并开始滞后。我做错了吗?我尝试在新线程中启动循环,并看到相同的结果。

【问题讨论】:

  • 您多久更新一次 UI?
  • 这段代码本身不太可能导致问题。在 UI 上更新 3 个文本框是一个非常简单的操作,应该几乎立即执行,但如果你在循环中执行,没有延迟......

标签: c# latency


【解决方案1】:

如果数据速率很高,那么您应该考虑使用批量更新。 不要在收到数据后立即更新,而是考虑每秒更新一次,或者在消息数量超过阈值时进行更新。

您可以使用后台工作程序处理数据并每隔一段时间更新 UI。您可以参考this SO question

【讨论】:

  • 谢谢!数据速率很高,所以我会添加批量更新。
【解决方案2】:

哪个线程调用invoke方法无关紧要。如果在紧密循环中调用它,无论如何它都会耗尽您的资源。在每次迭代之前尝试awaiting Task.Delay(millis) 一段时间。您甚至可以使用以下代码将其用作一种“最短时间”:

while (true)
{
    var updateFrequency = Task.Delay(1000);
    if (bStreaming == true)
    {
     textboxTX.Invoke(new Action(() => textboxTX.Text = Convert.ToString(result[0])));
     textboxTY.Invoke(new Action(() => textboxTY.Text = Convert.ToString(result[1])));
     textboxTZ.Invoke(new Action(() => textboxTZ.Text = Convert.ToString(result[2])));
    }
    await updateFrequency;
}

【讨论】:

  • 我注意到你不接受这个答案,有什么问题我可以解决吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-24
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 2019-10-26
  • 1970-01-01
相关资源
最近更新 更多