我程序的客户端和服务器都标记为STAThread,我在调试器中验证了我调用的线程被标记为STA。在服务器端,我验证了设置服务器时程序本身标记为STA。然而,实际的.Net远程调用是通过标记为MTA的线程完成的。无论如何都要改变这种行为,因为我的服务方法访问需要STA线程的资源。
答案 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对象等等。在这种情况下,它应该没问题,但是创建这个额外的线程会有一些开销。