0

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

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

4

1 回答 1

1

如果要更新 UI 元素,则必须在 UI 线程上进行。完成BackgroundWorker后,RunWorkerCompleted在 UI 线程上引发事件。如果 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
于 2013-10-14T18:41:32.343 回答