在后台工作程序之后访问Windows窗体的UI线程
本文关键字:窗体 UI 线程 Windows 访问 后台 工作程序 之后 | 更新日期: 2023-09-27 18:20:33
对于我的windows窗体应用程序,它是wcf服务的订阅者,我使用后台工作程序类来执行订阅代码,这样当我单击"订阅"按钮时,UI在尝试连接到服务时不会挂起。
在使用后台工作程序进行连接后,当它收到发布者的帖子时,即使使用了以下代码,它似乎也无法访问UI线程。
以下实现是在服务上创建的postReceived()方法上完成的,它处理订阅者在发布者(WCF Publish-Subscribe)发布发布帖子时执行的操作
backgroundForm b = (backgroundForm)Application.OpenForms[0];
b.BeginInvoke((MethodInvoker)delegate()
{
//codes to do whatever i wan to do with the GUI
//Examples of it would be disposing a flowlayout panel
//and re-adding it back and populating it again to
//show the refreshed values.
});
有人知道怎么解决这个问题吗?
编辑
除了UI代码没有执行之外,我还指出,每当收到帖子时,它还会显示一个tempForm,作为弹出窗口向用户提供反馈
notificationForm tempForm = (notificationForm)notificationList[notificationList.Count - 1];
tempForm.Show();
上述代码也没有执行。
您必须使用System.Windows.Threading.Dispatcher来访问UI。
试试这样的东西:
b.BeginInvoke((MethodInvoker)delegate()
{
Dispatcher.Current.Invoke((Action)(DoTheUiThings());
});
实际上您可以异步调用WCF服务,而无需使用backgroundWorker。请检查此线程中的答案。
下一个问题你应该问自己:"你确定Application.OpenForms[0]是你的调用表单吗?"
最后,我想知道为什么要使用BeginInvoke而不是更简单的Invoke()方法来更新表单UI元素。这不应该是一个长期运行的操作。
也许我不理解你的代码中的某些内容——请更准确地说明你有什么错误或问题。