假设我有一个WCF服务,可以访问多个客户端之间共享的一些数据。这两种设置有什么区别:
1)Instancing:Single,Concurrency:Multiple,共享数据存储在实例变量中。
2)Instancing:Per-Call,Concurrency:Multiple,共享数据存储在 static 变量中。
有什么实际区别吗?无论哪种方式,我都必须确保共享数据是线程安全的,但我想知道一种特定方法是否有任何优势。
答案 0 :(得分:1)
从理论上讲,没有区别。正如您所说,无论哪种方式,您都必须同步访问共享数据。实际上,第二种选择更好。从关于WCF的权威书籍Programming WCF Services到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();
}
}
显然,我已经省略了许多细节,但这显示了一般的想法。