【发布时间】:2013-06-19 22:01:35
【问题描述】:
如果有后台线程在运行一个操作,我希望 UI 线程等到它结束后再得到结果。
更多细节。当我打开一个对话框时,用户对两条信息感兴趣——我们称他们为Info1 和Info2。 Info1 需要 5 秒来检索,Info2 需要 15-30 秒来检索。为了不惹恼用户,我最初获取/显示Info1 并提供一个按钮来获取Info2。
当我获取Info1 时,我会启动一个后台线程来获取Info2。希望当用户按下Info2 的按钮时,它已经被获取(并缓存在内存结构中)并且用户可以立即看到信息。
现实情况是,90% 的时间,用户在后台线程完成之前按下Info2 按钮。
我的问题是这样的。在操作结束时随意挂接到后台线程并获取其结果的好模式是什么?
【问题讨论】:
-
作为一般模式,我会让工作线程在完成时发布其结果,因此根本不会“挂钩”到工作线程,而是发布到 UI 可以读取的数据结构按需,或向 UI 发出信号。这里有各种各样的选择。您可以使用对数据结构(一种“邮箱”)的同步访问,或者表示工作线程的类可以声明一个事件,UI 可以将处理程序附加到该事件,或者工作人员的“主”函数可以接受委托作为一个参数,它将调用以发出某些事件的信号。
-
看起来像您的 IDE 中的缺陷。从正在努力获取它的线程中获取不完整结果的想法有点偏离图表。看看 BackgroundWorker 是如何通过 ProgressChanged 事件一一滴漏结果的。线程推,你不拉。
-
@HansPassant 上述功能是从 UI 中删除的几个库。
标签: c# multithreading winforms .net-4.0 thread-safety