单例模式的多线程 WCF

Posted

技术标签:

【中文标题】单例模式的多线程 WCF【英文标题】:Multi-threading WCF with Singleton Pattern 【发布时间】:2016-10-17 12:10:21 【问题描述】:

我已经构建了 WCF 应用程序,现在我想将此服务作为多线程运行。 我正在并行运行三个线程,每个线程都有 WCF 服务对象。在每个线程开始时,我正在执行登录功能以检查用户是否有效&一旦有效,则其余方法将使用服务对象执行。 我的问题是,我如何创建单例模式来创建 WCF 服务对象,它将登录是返回我服务对象和相同的对象,然后与多个线程共享。 我查看了一些文章,但他们有带锁语句的单例。但是锁会阻止其他线程使用实例。 我需要与所有线程共享服务实例,当所有线程释放服务对象时,我必须调用注销方法。

任何帮助将不胜感激。

谢谢

【问题讨论】:

使用 TCP 监听器作为服务。每个客户端将使用不同的端口号。有两种实现方式。服务器可以列出一个端口号,然后在客户端连接时将客户端移动到另一个端口。或者让服务器打开多个端口号,然后让客户端尝试不同的端口号,直到建立连接。请参阅以下网页上的示例。示例使用套接字类,但您可以使用继承套接字的类,例如 TcpListener 和 TcpClient :msdn.microsoft.com/en-us/library/w89fhyex(v=vs.110).aspx 单线程和多线程几乎是互斥的术语。为什么要共享“服务对象”?为什么不为每个线程创建对象? @jdweng:TCP监听器和WCF有什么关系? WCF 可以使用任何传输方式吗? 感谢您的回复,我无法为每个线程创建新对象,因为登录对用户有第三方 api 验证,这将返回活动会话对象。所以我只想创建一个由所有线程共享的对象。 【参考方案1】:
public class clsSingleton

    private static clsSingleton instance = null;        

    clsSingleton()
    

    

    public static clsSingleton Instance
    
        get
        
            if (instance == null)
            
                instance = new clsSingleton();
            
        
    

    public string GetName()
    
        return "Name";
    



//如何调用GetName方法

string Name= clsSingleton .Instance.GetName();

【讨论】:

以上是关于单例模式的多线程 WCF的主要内容,如果未能解决你的问题,请参考以下文章

JAVA-初步认识-第十三章-单例模式涉及的多线程问题

JAVA学习第二十五课(多线程)- 单例设计模式涉及的多线程问题

单例设计模式---懒汉式的多线程安全隐患

三单例模式详解

单例模式与线程安全问题浅析

设计模式之单例模式