我在通过远程处理公开的单例类时遇到了一些问题。在我的服务器中,我有:
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 ) );
就远程处理而言,一切都很好,但是当我像这样在服务器代码中访问单例对象时:
int someValue = RemotableObject.Instance.SomeDynamicValue;
它访问的实例与客户端访问的实例不同。我还验证了 RemotableObject 中的私有(private)构造函数在调试时被命中了两次。
如果我通过服务器代码中的远程处理获得 RemotableObject 的实例,我可以获得所需的行为,但是有没有一种方法可以在没有远程处理开销的情况下从服务器访问与我的客户端相同的对象?
最佳答案
如果我理解您的要求,(您希望对象存在于服务器上,但您希望所有客户端调用都在服务器上获得该对象的相同实例,并且您还希望在服务器代码中进行调用获得相同的实例?)
然后,如果您的服务器是“ServerName”,并且正在监听端口 nnnn,Uri 是“MyMsgEndpointUri”,那么您已将 Uri 定义为:
var MesgUri = "tcp://ServerName:nnnn/MyMsgEndpointUri";
在您的服务器中,通过以下方式初始化端点:
RemotingServices.Marshal([singletonInstance], MesgURI);
代替 RegisterWellKnownServiceType();
此外,在表示单例的类中,请记住用空操作覆盖 InitializeLifetimeService 属性...否则单例对象将在某个时候收集垃圾...
public override object InitializeLifetimeService() { return (null); }
从服务器上,只需调用单例类的静态工厂方法来访问该单例实例...根本不要使用远程调用...
关于c# - 在 .Net Remoting 中使用单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/735822/