【问题标题】:When backgroundworker completes, how to give priority to update the UI thread?backgroundworker完成后,如何优先更新UI线程?
【发布时间】:2013-10-14 16:45:46
【问题描述】:

我有一个后台工作人员,我正在使用它来运行一个大型函数,以期加快我的窗口加载和响应速度。当我将此函数放在后台工作人员的 doWork 事件中时,我只是想知道是否可以优先考虑在 BGW 完成后立即更新该文本,而不是等待 UI 线程完成然后更新文本框。这可能吗?我只是问,因为在运行函数后似乎需要相当多的时间来更新文本框(大约需要 1.5-2 秒),但即使我启动 BGW 甚至在窗口加载之前开始(需要 5 秒才能加载) ),它仍然是我窗口上要更新的最后一个项目,所以我想(如果可能的话)暂停 UI 线程更新 UI,直到我用这个函数返回的内容进行更新,然后继续更新其余的标签。

另外,是否可以一次更新两个单独的项目,还是仅限于一个 UI 线程?

【问题讨论】:

  • BackgroundWorkers 不会让事情变得更快,它们只是提供了一种运行代码而不阻塞 GUI 的方法。话虽如此,听起来您仍在运行阻止 GUI 的代码,因为您是 waiting for the UI thread to finish。您将不得不发布一些代码。

标签: vb.net multithreading winforms backgroundworker


【解决方案1】:

如果要更新 UI 元素,则必须在 UI 线程上进行。当BackgroundWorker 完成时,在UI 线程上引发RunWorkerCompleted 事件。如果 UI 线程忙于做某事,那么完成的事件必须等待。一般来说,没有安全的方法可以中断 UI 线程,让它处理RunWorkerCompleted 事件,然后返回它正在做的事情。

UI 元素必须从 UI 线程更新。所以你不能一次更新两个单独的项目。

我不知道你的初始化是如何构建的,但是如果你有一组项目可以在 BGW 完成之前初始化,而另一组在 BGW 完成之前不能更新,那么做第一个分组并停止。然后让RunWorkerCompleted 处理程序进行更新和所有其余的更新。所以它看起来像:

FormLoad()
    start background worker
    do first group of updates

RunWorkerCompletedHandler()
    update from BGW calculation
    do rest of updates

【讨论】:

    猜你喜欢
    • 2015-06-29
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多