c# - 在 .Net Remoting 中使用单例

标签 c# .net singleton 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 ) );

就远程处理而言,一切都很好,但是当我像这样在服务器代码中访问单例对象时:

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/

相关文章:

c# - Microsoft.Office.Interop.PowerPoint.dll PowerPoint CustomDocumentProperties 大问题

.net - DataTable 和 DataSet 现在应该过时了吗?

c++ - 检查实例是否存在并在 Singleton getInstance() 中返回引用;

iphone - 如何接收异步请求对单例的响应?

c# - MVVM 将控制句柄传递给模型

c# - Unity Animator Inspector 中的错误。看不到任何值

c# - 我应该为我的 Linq2Sql 数据使用 Struct 而不是轻量级数据类吗?

c# - IEnumerator 返回记录

android - 创建带有 Dagger 2 的单例的最简单方法?

c# - 如何在没有任何数据库的情况下保存我的 datagridview?