在后台工作程序之后访问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();

上述代码也没有执行。

在后台工作程序之后访问Windows窗体的UI线程

您必须使用System.Windows.Threading.Dispatcher来访问UI。

试试这样的东西:

 b.BeginInvoke((MethodInvoker)delegate()
 {
    Dispatcher.Current.Invoke((Action)(DoTheUiThings());
 });

实际上您可以异步调用WCF服务,而无需使用backgroundWorker。请检查此线程中的答案。

下一个问题你应该问自己:"你确定Application.OpenForms[0]是你的调用表单吗?"

最后,我想知道为什么要使用BeginInvoke而不是更简单的Invoke()方法来更新表单UI元素。这不应该是一个长期运行的操作。

也许我不理解你的代码中的某些内容——请更准确地说明你有什么错误或问题。