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