2016-11-18 73 views
2

C#的運行時環境是否可以從MTA線程上下文(.Net WebApi請求)中調用STA遠程應用程序類型庫的安全(從線程模型和公寓透視圖)?從WebApi調用STA COM對象

我應該將服務器STA應用程序更改爲MTA還是RCW將在幕後處理這些機制?

回答

1

RCW是COM代理的.NET代理。無論您在.NET應用程序中使用哪個公寓,RCW都會爲您處理編組。

而且由於對象是遠程的,您不需要擔心公寓是否兼容,通信就會跨越流程。如果您使用的是本地語言和環境(例如C++),則只需擔心不要跨公寓共享COM代理,換句話說,就是爲了在每個公寓中正確編組代理引用。

如果對象正在處理中,您將獲得共享相同公寓的性能,但在進程之間,編組和線程調度延遲將是最大的開銷。

但是,您應該考慮其他應用程序使用的是哪個單元。使用STA的應用程序將是單線程的,因此這將成爲ASP.NET應用程序的瓶頸。如果它使用MTA,可能不會,如果它不同步所有的呼叫或者如果關鍵部分很快。

對於應用程序,您通常無法控制使用的公寓。你將如何改變它的公寓?這是一個COM +組件嗎?這是你的代碼嗎?它是否準備好了公寓開關?

+0

基本上我會改變爲自由線程並在代碼的關鍵區域應用一些鎖定。但與應用程序中的其他功能相比,此IPC機制很少使用,因此性能不會成爲問題。我想我會離開的。 – EProgrammerNotFound

+0

我在RCW的類構造函數中遇到了問題,它間歇性地引發了type_e_cantloadlibrary,關閉了pro-proc服務器解決方案,但這不是生產環境的高質量解決方案。因此,這個問題。 – EProgrammerNotFound

+1

我相信你在談論一個進程內服務器(DLL),而不是一個進程外服務器(EXE,使用代理的DLL)。更改在註冊表中輕鬆完成的進程內服務器的註冊公寓,但服務器必須支持該類型的公寓。更改由進程外服務器(不使用代理程序)使用的公寓通常意味着更改代碼或使用某些特定於應用程序的設置。 – acelent