【问题标题】:WCF: Instancing and Concurrency questionWCF:实例化和并发问题
【发布时间】:2010-11-12 22:57:30
【问题描述】:

假设我有一个 WCF 服务,它可以访问在多个客户端之间共享的某些数据。这两种设置有什么区别:

1) 实例化:单个,并发:多个,共享数据存储在实例变量中。

2) 实例化:每次调用,并发:多个,共享数据存储在静态变量中。

有什么实际区别吗?无论哪种方式,我都必须确保共享数据是线程安全的,但我想知道一种特定方法是否有任何优势。

【问题讨论】:

    标签: c# wcf concurrency instances


    【解决方案1】:

    理论上,没有区别。正如您所说,无论哪种方式,您都必须同步对共享数据的访问。实际上,第二种选择更好。来自关于 WCF 的权威书籍,Programming WCF Services by Juval Lowy

    ...每次调用服务实际上是 首选的实例管理模式 WCF 服务...建议您 在一般情况下避免单例 并找到分享状态的方法 单例而不是单例 实例本身。

    我在我的项目中使用选项 #2。 WCF 服务本身只是执行工作的类的静态方法的一个薄外观。例如,

    public class Logger
    {
        private static List<Logger> _loggers = new List<Logger>();
        private static object _sync = new object();
    
        public static void Start()
        {
            Logger logger = new Logger();
            logger.Start();
    
            lock (_sync) {
                _loggers.Add( logger );
            }
        }
    
        private Logger()
        {
            // construct the Logger object...
        }
    
        private void Start()
        {
            // start the logger here...
        }
    }
    
    public class LoggingService : ILoggingService
    {
        public void StartLogger()
        {
            Logger.Start();
        }
    }
    

    显然,我省略了许多细节,但这表明了大体思路。

    【讨论】:

    • 很好的参考,尽管我仍然不清楚为什么选项 2 通常是更好的方法。是否存在选项 1 不太灵活或效率不高的情况?
    • 这本书说选项 2 比选项 1 更适合事务处理。对我来说是有道理的,但由于它对我的项目没有用,所以我没有探索过这方面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多