假设我有一个 WCF 服务可以访问多个客户端之间共享的某些数据。这两种设置有什么区别:
1)Instancing:Single,Concurrency:Multiple,共享数据存储在实例变量中。
2)实例化:每次调用,并发:多个,共享数据存储在静态变量中。
有什么实际区别吗?无论哪种方式,我都必须确保共享数据是线程安全的,但我想知道一种特定方法是否有任何优势。
假设我有一个 WCF 服务可以访问多个客户端之间共享的某些数据。这两种设置有什么区别:
1)Instancing:Single,Concurrency:Multiple,共享数据存储在实例变量中。
2)实例化:每次调用,并发:多个,共享数据存储在静态变量中。
有什么实际区别吗?无论哪种方式,我都必须确保共享数据是线程安全的,但我想知道一种特定方法是否有任何优势。
从概念上讲,没有区别。正如您所说,无论哪种方式,您都必须同步对共享数据的访问。实际上,第二种选择更好。来自关于 WCF的权威书籍,Juval Lowy的Programming WCF Services:
...每次调用服务实际上是 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();
}
}
显然,我省略了许多细节,但这表明了总体思路。