【问题标题】:Is it possible to update the UI from the backgroundworker dowork event是否可以从 backgroundworker dowork 事件更新 UI
【发布时间】:2011-04-15 23:03:15
【问题描述】:

我见过其他人有类似的问题,但不是我想要的。在 backgrounderworker 类 dowork 事件中,我创建了一个新类的实例并调用其中一个函数。以前,我在 windows.form.timer 滴答事件中有此代码,并将委托作为参数之一传递,这将允许它在类中调用的函数和其他函数调用表单上的方法来更新数据网格在图形用户界面上。有没有办法在 dowork 事件中做到这一点?我需要这个,因为我从 dowork 调用的函数调用了其他函数,我希望这些函数中的每一个都在 GUI 数据网格中记录信息。

【问题讨论】:

    标签: vb.net backgroundworker


    【解决方案1】:

    您可以将进度数据发送回 UI 线程,您将在 UI 线程上获得一个事件,然后您可以更新屏幕。 强烈推荐发送回 UI 线程的对象是不可变的。除了调用ReportProgress 和处理您需要通过将WorkerSupportsProgress 属性设置为true 来选择加入的事件。

    【讨论】:

      【解决方案2】:

      BackgroundWorker.ReportProgress() 方法旨在做到这一点。您实现 ProgressChanged 事件来更新 UI,它将在主线程上运行。您不仅可以报告进度百分比,还可以使用接受 userState 参数的重载传递任何对象以将信息传递给事件处理程序。请注意,如果这样做,您必须使用正确的锁定。

      【讨论】:

      • 不要忘记在后台工作人员本身上将WorkerReportsProgress 属性设置为true
      • 这是我在使用 ReportProgress 时遇到的问题。在 DoWork 中,我调用了一个函数。该函数调用其他函数。我希望所有这些功能都能够向 UI 发送状态更新。
      • 因此,编写一个调用 ReportProgress 的函数,以便所有这些其他函数都可以调用它。如果必须,请通过代表。小心,线程编组非常昂贵。每秒调用它超过 1000 次,当 UI 线程无法跟上时,它就会死掉。
      【解决方案3】:

      除了 Hans 的回答中提到的 ReportProgess 之外,您还可以在 UI 元素之一上使用 Control.Invoke 以在 UI 线程中执行代码。

      【讨论】:

      • 但是在 DoWork 中,我可以将这种能力(作为委托参数)传递给我在 DoWork 中实例化的类吗?
      • @user94593:Control.Invoke 的 MSDN 页面(请参阅我的答案中的链接)最后包含一个示例。
      • @user94593:允许您传递参数的第二个重载可能对您也很有趣(同样,示例包含在底部):msdn.microsoft.com/en-us/library/a1hetckb.aspx
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 2013-07-29
      相关资源
      最近更新 更多