2010-10-07 62 views
2

我的程序的客戶端和服務器都標記爲STAThread,並且我在調試器中驗證了我所調用的線程被標記爲STA。在服務器端,我確認了在設置服務器時程序本身被標記爲STA。然而,實際的.Net遠程調用是通過標記爲MTA的線程完成的。無論如何要改變這種行爲,因爲我的服務方法訪問需要STA線程的資源。如何設置爲.Net Remoting調用提供服務的線程的公寓狀態?

回答

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); 
    } 
+0

我試過了,除非我做錯了。我的程序主內部裝有[STAThread],我運行了Application.Run(dummyForm);在我用上面的覆蓋創建的虛擬表單上。然後我創建了一個存根方法LaunchViaMainThread(Action action){Program.DummyForm.BeginInvoke(action); }。然後我通過myProxyInstance.LaunchViaMainThread(myProxyInstance.Run)調用它。來自我的客戶。當我進入myProxyInstance.Run時,我仍然看到線程被標記爲MTA。 – esac 2010-10-07 19:00:07

+0

我不知道,當然應該工作。添加一些日誌記錄,在主線程和被調用的回調中顯示Thread.CurrentThread的ManagedId和GetApartmentState()。 – 2010-10-07 19:06:20

+0

然後仔細檢查Program.DummyForm.InvokeRequired是否爲true。 – 2010-10-07 19:06:49

1

您可以創建另一個線程並將其標記爲STA以讀取資源。我假設它不會被用來訪問COM對象等等。在這種情況下,它應該是可以的,但是創建這個附加線程會產生開銷。

+0

我試過了,它無法在我創建的線程上設置公寓狀態。 – esac 2010-10-07 18:07:12

相關問題