如何从工作线程调用更新 UI 线程?

How does calling an updating UI thread from a Work thread works?

提问人:CiNN 提问时间:10/20/2008 更新时间:10/20/2008 访问量:1324

问:

如果我在线程中有一个正在处理某些数据的函数,那么它会调用一个回调函数来更新 UI 中的状态。

如果 UI 需要时间来处理回调函数,那么它就没有那么有用了。 它是否应该向 UI 发送某种消息,而不是只处理回调函数中的更新,这样它就不会阻止?

我的意思是,当我在处理函数中调用更新状态函数时,这应该立即返回到处理函数,然后在更新中它可以等待它想要的所有事情,以便UI更新完成。

或者我需要第三个线程来处理向 UI 发送更新数据?

多线程 用户界面 异步

评论


答:

0赞 TheObserver 10/20/2008 #1

Mapad在这里发布了一个关于UI和线程的链接,你可能会发现它很有用。你没有提到哪个UI工具包和哪种语言,所以我不能给你任何细节。

评论

0赞 CiNN 10/20/2008
我不明白的是,当您调用更新时如何不阻止
0赞 TheObserver 10/20/2008
windows_notify就是答案。您需要通知“父”小部件。
2赞 Jon Skeet 10/20/2008 #2

通常有一种方法可以将回调发布到 UI 线程而不会阻塞。

例如:

我敢肯定,如果你看一下你正在使用的UI工具包的文档,你会发现类似的东西。

2赞 Bogdan Maxim 10/20/2008 #3

在 .NET(WinForms、WPF、Silverlight)中,只需在 UI 的线程上使用 Dispatcher 对象来调用用户界面的 update 方法。 调度程序可以同步调用(使用 Invoke),也可以异调用(使用 BeginInvoke/EndInvoke)。请注意,在 .NET 中,需要为每个 BeginInvoke 调用 EndInvoke(因为 .NET 不保证异步句柄将被释放),因此默认情况下,Fire and Forget 不是一个选项(除非你实现自己的 FireAndForget)

评论

0赞 Jon Skeet 10/20/2008
Windows 窗体团队之前曾说过,您可以触发并忘记对 Control.BeginInvoke 的调用。显然,此承诺不适用于 WPF。
0赞 Bogdan Maxim 10/21/2008
他们这么说,但他们说,不能保证在新的服务包或更新版本之后会是一样的