【问题标题】:My processing thread is going too fast for my UI thread我的处理线程对于我的 UI 线程来说太快了
【发布时间】:2013-11-06 02:56:52
【问题描述】:

我有一个 C# 程序,它正在检查文件和注册表项是否存在,并在 Form.Textbox 上为它正在寻找的每个文件和注册表项使用 AppendText()

这是在异步 BackgroundWorker 中运行的,现在我的后台工作人员实际上处理速度非常快,以至于我的 UI 线程被 AppendText 命令阻塞并且程序崩溃了。如何同步 BackgroundWorker 和 UI 线程,以便在 UI 线程准备好之前 BackgroundWorker 不会再次开始处理?

【问题讨论】:

  • 你能给我们看一些代码吗?我不明白你说的有什么意义。
  • 你试过绑定数据吗?
  • 你试过System.Windows.Forms.Control.Invoke方法吗?
  • 一个 WaitHandle 可能...
  • 了解您是否要减慢生产者线程、加快消费者 (UI) 线程以及显示哪种数据也会很有用。

标签: c# multithreading backgroundworker synchronize


【解决方案1】:

您拥有BackgroundWorker,因此您拥有所需的一切。在 UI 线程上调用进度事件,因此如果工作人员以标准方式报告进度(通过调用 ReportProgress(int32, object),并将要附加的字符串作为第二个参数传递,表单的进度处理程序可以调用 AppendText。后台线程永远不会以这种方式超过 UI。

我怀疑你打电话给BeginInvoke 来更新你的用户界面。解决问题的另一种方法是致电Invoke

如果您让后台工作人员保存 10 行代码,然后一次性将它们全部传递给进度事件,您会做得更好。这将减少更新的开销并使您的后台线程处理得更快。

【讨论】:

    【解决方案2】:

    想到的一种方法是将命令排队并允许 UI 线程以自己的速度处理它们 :: IE 创建参数的通用列表(我们称之为 appendtext),后台工作人员将其添加到列表中并UI 线程读取、调用,然后从列表中删除

    【讨论】:

    • 或者更好;停止尝试一次更新,而是分批进行。
    • 这是个好主意...将您想要完成的更改加载到一个列表中,并且用户界面会在每个滴答声中更新列表中的所有内容:)
    • 是的,没错!进行微小的更新可能是问题的很大一部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2011-09-07
    • 2016-01-11
    相关资源
    最近更新 更多