如何设置为.Net Remoting调用提供服务的线程的单元状态?

时间:2010-10-07 17:22:36

标签: c# multithreading remoting

我程序的客户端和服务器都标记为STAThread,我在调试器中验证了我调用的线程被标记为STA。在服务器端,我验证了设置服务器时程序本身标记为STA。然而,实际的.Net远程调用是通过标记为MTA的线程完成的。无论如何都要改变这种行为,因为我的服务方法访问需要STA线程的资源。

2 个答案:

答案 0 :(得分:2)

远程处理无法做到这一点,对STA线程的一个硬性要求是它还会提供消息循环。您确实必须创建自己的线程,使用Thread.SetApartmentState()在启动之前将其切换到STA 。并使用带有虚拟表单的Application.Run()来启动消息循环。然后,您可以使用Control.BeginInvoke()来编组从远程处理线程到此新线程的调用。

请注意,由于您已经为服务器启动了一个STA线程,因此该线程可以正常工作。将其粘贴到表单类中以防止其显示:

    protected override void SetVisibleCore(bool value) {
        if (!this.IsHandleCreated) {
            this.CreateHandle();
            value = false;
        }
        base.SetVisibleCore(value);
    }

答案 1 :(得分:1)

您可以创建另一个线程并将其标记为STA以读取资源。我假设它不会被用来访问COM对象等等。在这种情况下,它应该没问题,但是创建这个额外的线程会有一些开销。