我的程序的客戶端和服務器都標記爲STAThread,並且我在調試器中驗證了我所調用的線程被標記爲STA。在服務器端,我確認了在設置服務器時程序本身被標記爲STA。然而,實際的.Net遠程調用是通過標記爲MTA的線程完成的。無論如何要改變這種行爲,因爲我的服務方法訪問需要STA線程的資源。如何設置爲.Net Remoting調用提供服務的線程的公寓狀態?
2
A
回答
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
您可以創建另一個線程並將其標記爲STA以讀取資源。我假設它不會被用來訪問COM對象等等。在這種情況下,它應該是可以的,但是創建這個附加線程會產生開銷。
+0
我試過了,它無法在我創建的線程上設置公寓狀態。 – esac 2010-10-07 18:07:12
相關問題
- 1. 如何爲使用`AppDomain.ExecuteAssembly`加載的代碼設置COM公寓狀態?
- 2. 如何將背景工作線程設置爲單線程公寓?
- 3. .Net Remoting - 重新引導服務器並獲得重啓狀態
- 4. IWebBrowser2和多線程的公寓?
- 5. 動態laravel4服務提供商路線
- 6. Android設置服務狀態
- 7. 將服務狀態設置爲Stop_Pending
- 8. MSBuild任務失敗 - 沒有在單線程公寓運行
- 9. 關於公寓的線程模型
- 10. .Net Remoting:從服務器調用客戶端上的方法
- 11. 如何調用我的自定義設置提供程序?
- 12. .Net Remoting返回值區分來自不同線程的調用
- 13. .NET MVC - 如何利用自定義設置提供程序?
- 14. 如何爲無服務器功能設置默認狀態碼?
- 15. .NET中用於Windows服務的進程內WMI提供程序
- 16. 如何讓Quartz.net作業在單線程的公寓中運行?
- 17. .net remoting,客戶端服務器,遠程回調
- 18. 在實例化proc COM對象時指定要使用的公寓狀態
- 19. 控制.NET進程服務器提供的COM對象的線程模型
- 20. 的Java多線程狀態服務器 - 網絡設計
- 21. 提供實時遊戲狀態更新的服務器
- 22. 在打字稿中爲服務提供動態函數調用
- 23. 設置服務器來提供文件
- 24. 來自工作線程的ATL示例調用(編組)從工作線程的公寓線程COM接口
- 25. 如何從狀態中移除狀態提供程序
- 26. 如何使用nginx爲靜態Jira文件提供服務?
- 27. 如何爲我的本地設置設置公共API調用?
- 28. 在.Net Remoting服務中註冊動態類型的問題
- 29. 如何設置http響應的服務器狀態碼?
- 30. 從無狀態服務設置sessionScoped bean?
我試過了,除非我做錯了。我的程序主內部裝有[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
我不知道,當然應該工作。添加一些日誌記錄,在主線程和被調用的回調中顯示Thread.CurrentThread的ManagedId和GetApartmentState()。 – 2010-10-07 19:06:20
然後仔細檢查Program.DummyForm.InvokeRequired是否爲true。 – 2010-10-07 19:06:49