2009-04-09 47 views
14

我對通過遠程處理公開的單例類有點問題。在我的服務器我有:在.Net Remoting中使用單身人員

TcpChannel channel = new TcpChannel(Settings.Default.RemotingPort); 
ChannelServices.RegisterChannel(channel, false); 
RemotingConfiguration.RegisterWellKnownServiceType( 
    typeof(RemotableObject), "RemotableObject", 
    WellKnownObjectMode.Singleton); 

RemotableObject是一個單獨的對象繼承MarshalByRefObject的。

我的客戶端通過連接到它:

remoteObject = (RemotableObject)Activator.GetObject(
    typeof(RemotableObject), 
    string.Format("tcp://{0}:{1}/RemotableObject", serverIP, serverPort)); 

一切都很正常至於遠程去,但是當我訪問singleton對象在我的服務器這樣的代碼:

int someValue = RemotableObject.Instance.SomeDynamicValue; 

它訪問與客戶端不同的實例。我還驗證了在調試時,RemotableObject中的私有構造函數會被擊中兩次。

如果我通過遠程處理在服務器代碼中獲取實例給RemotableObject,但是有沒有一種方法可以從服務器訪問與我的客戶端相同的對象而不需要遠程處理開銷?

回答

30

如果我明白你在做什麼之後(你想讓對象住在服務器上,但你希望所有的客戶端調用都能在服務器上獲得同一個對象實例,並且你還希望在服務器上調用?代碼來獲得相同的實例)

那麼,如果您的服務器「服務器名稱」,並且它正在偵聽端口NNNN,用URI作爲「MyMsgEndpointUri」,已定義的URI作爲:

var MesgUri = "tcp://ServerName:nnnn/MyMsgEndpointUri"; 

,通過以下方式初始化端點:

RemotingServices.Marshal([singletonInstance], MesgURI); 

而不是RegisterWellKnownServiceType();

此外,在代表單類,記得一個空操作覆蓋InitializeLifetimeService財產......或者單對象將獲得在某些時候收集垃圾......

public override object InitializeLifetimeService() { return (null); } 

從服務器,只需打電話給你的單身班靜態工廠方法來獲得訪問該單件實例。請不要使用遠程調用在所有...

+0

完美的工作!感謝您及時的回覆! – Todd 2009-04-09 20:50:06

-2

編號

無法讀取服務器中客戶端的內存。

-1

我從來沒有嘗試撥打Activator.GetObject從服務器端,但應該返回客戶端使用的相同實例。但是,你仍然會得到一個代理。