在.NET Remoting中使用Singleton与Single Call?

Dan*_*olt 1 .net remoting singleton windows-services

到目前为止,我编写或使用过的所有.NET远程处理代码都已公开为SingleCall.

我遇到了一个托管在Windows服务中的.NET远程处理组件,该服务作为Singleton公开.

此对象有可能被多个客户端同时调用,并且没有锁定或其他规定来保护其内部状态.

如果我正确理解Singleton那么这可能会导致大问题正确吗?

Cha*_*ana 8

没有比SingleCall组件更具潜力的了.如果他们试图以不安全的方式访问共享内存位置,则两者都会出现问题.

SingleCall和Singleton之间的区别在于,对于SingleCall,每个传入请求都将获得为处理该调用而创建的已定义类型的新实例.每个实例都有自己的内存空间和实例变量,但它们仍然可以共享静态和全局变量,外部资源,文件,网络连接等.如果SingleCall类被编码为以线程不安全的方式访问任何共享内存状态那么你就会有问题.

另一方面,Singleton只获得为所有传入请求创建的一个实例,因此根据定义,该单例中使用的每个实例变量实际上在所有传入请求之间共享.一个很好的例子可能是消息发布者,服务器中的所有代码都需要访问以向一个或多个订阅的客户端发送消息....

要解决来自@Cocowalla的评论,请确保如果您这样做,则覆盖该方法

  MarshalByRefObject.InitializeLifetimeService() 
Run Code Online (Sandbox Code Playgroud)

如图所示,如果没有人暂时调用它,你的单身人士会意外死亡......

public class MessageManager : MarshalByRefObject
{
    #region Singleton / MarshalByRefObject code        
    private static MessageManager mgr = 
        new MessageManager(); // creates singleton 
    static MessageManager() { }
    private MessageManager() { }
    public static MessageManager Instance { get { return mgr;  } }
    public override object InitializeLifetimeService() { return (null); }
    #endregion Singlelton code
    // ... other stuff ... 
 }

  // in Remoting Host initialization code...      
   MessageManager mgr = MessageManager.Instance; // generates singleton;
   RemotingServices.Marshal(mgr, URI);
Run Code Online (Sandbox Code Playgroud)