提问人:CiNN 提问时间:10/20/2008 更新时间:10/20/2008 访问量:1324
如何从工作线程调用更新 UI 线程?
How does calling an updating UI thread from a Work thread works?
问:
如果我在线程中有一个正在处理某些数据的函数,那么它会调用一个回调函数来更新 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 线程而不会阻塞。
例如:
- 在 Win32 上有 PostMessage
- 在 .NET Windows 窗体中,有 Control.BeginInvoke(它实现 ISynchronizeInvoke.BeginInvoke )
- 在 Java 中,有 EventQueue.invokeLater
我敢肯定,如果你看一下你正在使用的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
他们这么说,但他们说,不能保证在新的服务包或更新版本之后会是一样的
下一个:.net/C 中的网络#
评论