Winforms 如何访问WCF订阅服务器的UI线程?

Winforms 如何访问WCF订阅服务器的UI线程?,winforms,wcf,user-interface,Winforms,Wcf,User Interface,我目前正在开发一个WCF发布-订阅服务。订阅服务器是一个winform应用程序。因为订阅者需要实现服务的回调方法,在我的例子中是PostReceived()方法,而发布者拥有PublishPost()方法 对于我的winform的PostReceived()方法,它无法访问我的winform的UI线程。subscribe方法是在我的main方法上完成的。如何编程PostReceived()方法,使其能够访问mainForm的标签等 编辑 到目前为止,我尝试从program.cs调用mainFor

我目前正在开发一个WCF发布-订阅服务。订阅服务器是一个winform应用程序。因为订阅者需要实现服务的回调方法,在我的例子中是PostReceived()方法,而发布者拥有PublishPost()方法

对于我的winform的PostReceived()方法,它无法访问我的winform的UI线程。subscribe方法是在我的main方法上完成的。如何编程PostReceived()方法,使其能够访问mainForm的标签等

编辑

到目前为止,我尝试从program.cs调用mainForm对象,但当我运行所有3个时,它崩溃了,并指出错误是它无法访问UI线程

编辑2

我已尝试使用以下代码,但有一个错误

mainForm b;   
public void PostReceived(string postSampleData)
    {
        b.BeginInvoke((MethodInvoker)delegate()
        {
            b.lblSearch.Text = "lakjslkaja";
        });
运行代码后,出现错误

Object reference not set to an instance of an object.

知道如何修复它吗?

您的PostReceived方法应该是这样的

void PostReceived()
        {
            yourform.BeginInvoke((MethodInvoker)delegate()
                {
                    yourform.button.Text = "new label";
                    //More stuff here
                });
        }

这将保证在UI线程中调用BeginInvoke之后的所有内容

到目前为止你有什么代码?我想到的解决方案是使用BackgroundWorker线程,并在该调用中启动WCF调用。我如何使用BackgroundWorker线程?我已经编辑了上面的帖子。事实上,帕拉普拉的答案更好。我以前处理过这个问题,但是找不到代码示例来为您发布。代码应该放在哪个文件中?由于我的当前代码放在program.cs中,非静态字段、方法或属性“System.Windows.Forms.Control.BeginInvoke(System.Delegate)”需要对象引用时出错,如果该错误是因为我没有在其中输入任何代码,键入“mainform”后,没有任何UI代码可供我输入。我会将其放在您的UI所在的同一文件中,换句话说,是您的Windows窗体文件,而不是program.cs文件。无论您决定将其放在哪里
Application.OpenForms[0]如果您的应用程序中只有一个表单,则
将为您提供表单。如果您没有太多表单,而您的主表单名为MainForm,请在PostReceived函数中执行a
MainForm b=Application.OpenForms[0]
操作。您得到的错误是因为
MainForm b
设置为空