【问题标题】:Unresponsive UI when using BeginInvoke使用 BeginInvoke 时 UI 无响应
【发布时间】:2011-01-31 10:27:16
【问题描述】:

背景
我有一个用 C# 编写的网络应用程序。我的服务器程序有一个 UI 和几个通信线程,它们从 tcp 套接字读取并在控制器 UI 上显示消息。

与每个客户端的通信是通过单独的线程完成的。当我从一个客户端收到一些消息流时,该客户端的线程会在 UI 上写入,这是表单上的富文本框。

我调用表单的 SetTextHelper(string text) 方法。

看起来像这样

private delegate void MyTextUpdateHandler(string text);
public void SetTextHelper(string text)
{
   BeginInvoke(new MyTextUpdateHandler(SetText), new object[] { text });
}

public setText(string text)
{
   richtext.Text+= text;
}

问题
- 如果我使用 BeginInvoke,当我将大量数据流写入 UI 时,我的 UI 完全没有响应 - Invoke 解决了这个问题,但我读到对于多线程环境,其中许多 thereads 共享相同的资源 Invoke 可能导致死锁,我在大约 16 个线程之间共享公共 ichtextbox - 我的情况有什么好的设计?

【问题讨论】:

    标签: .net multithreading user-interface


    【解决方案1】:

    您可能只是把所有时间都花在设置文本上。

    尝试将RichTextBox 替换为普通的TextBox;它应该更快。

    【讨论】:

      【解决方案2】:

      Invoke 不应导致死锁,除非您在调用时拥有锁……但 BeginInvoke 也不应使 UI 无响应。问题可能是您只是过于频繁地尝试更新文本框吗?也许更多地缓冲传入的文本?例如,仅每半秒更新一次 UI,而不是在您读取任何数据时。

      【讨论】:

      • 请注意,他没有追加。
      • @SLaks:他很可能会在调用SetTextHelper 的代码中添加内容。目前还不清楚为什么 UI 没有响应,但我怀疑它只是数据过载。
      • 是的,我正在将数据附加到富文本框。但我很困惑为什么 Invoke 使它正常工作而 BeginInvoke 不能?我每次添加到富文本框的文本都很小,大约 64 个字符
      • @Kazoom:Invoke 将等待 UI 更新,然后再继续 - 因此这可能会有效降低您接收数据的速度。不过,我们需要更多地了解您在做什么。
      • @jon 我没有做更多的事情。我尝试编写一个打印大量文本的永久循环,并尝试调用invoke和begininvoke,并且在invoke正常工作时,begininvoke破坏了整个UI也有类似的影响
      【解决方案3】:

      您过于频繁地调用 BeginInvoke()。 UI 线程将在执行其正常职责之前调度委托,例如绘制控件和响应鼠标。如果委托目标正在做大量工作(将文本附加到 RTB 很昂贵)或者您只是用请求淹没它,那么它就无法再做正常的工作了。 UI 将冻结。这很容易发生,每秒大约 1000 次调用就足够了。

      解决这个问题的关键是要意识到经常调用是浪费精力。人眼无法以每秒 25 次以上的速度感知更新。所以缓冲文本直到自上次更新以来已经过去了 50 毫秒。 Environment.TickCount 是一个廉价的计时器。

      另外请注意,您实际上生成文本的速度可能比附加到 RTB 的速度要快。这需要限制线程。这很简单:使用 Invoke 而不是 BeginInvoke。

      【讨论】:

      • 好的,我会尝试这样做,但为什么我不应该使用 BeginInvoke 而不是 Invoke 得到无响应?
      • 有趣的是,TickCount 以毫秒为单位 - 而不是滴答声(他们到底在想什么?)
      • 这个名字是在 1980 年代后期选择的。那时时钟滴答作响。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      相关资源
      最近更新 更多