当backgroundworker完成时,如何优先更新UI线程?

时间:2013-10-14 16:45:46

标签: vb.net multithreading winforms backgroundworker

我有一个后台工作者,我正在使用它来运行一个大型函数,希望加快我的窗口负载和响应能力。当我把这个函数放在背景工作者的doWork事件中时,我只是想知道无论如何我都可以在BGW完成后立即更新该文本,而不是等待UI线程完成然后更新文本框。这可能吗?我只是问,因为在运行该函数后需要花费很多时间才能更新文本框(大约需要1.5-2秒),但即使我在窗口加载之前启动BGW也要开始(需要5秒才能加载) ),它仍然是我的窗口上的最后一项更新,所以我想(如果可能的话),暂停UI线程更新UI,直到我更新此函数返回的内容,然后继续更新其余标签。

另外,无论如何要一次更新两个单独的项目还是仅限于一个UI线程?

1 个答案:

答案 0 :(得分: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