WCF:Instancing和Concurrency问题

时间:2010-11-12 22:57:30

标签: c# wcf concurrency instances

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

1)Instancing:Single,Concurrency:Multiple,共享数据存储在实例变量中。

2)Instancing:Per-Call,Concurrency:Multiple,共享数据存储在 static 变量中。

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

1 个答案:

答案 0 :(得分:1)

从理论上讲,没有区别。正如您所说,无论哪种方式,您都必须同步访问共享数据。实际上,第二种选择更好。从关于WCF的权威书籍Programming WCF ServicesJuval 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();
    }
}

显然,我已经省略了许多细节,但这显示了一般的想法。