【发布时间】:2010-11-12 22:57:30
【问题描述】:
假设我有一个 WCF 服务,它可以访问在多个客户端之间共享的某些数据。这两种设置有什么区别:
1) 实例化:单个,并发:多个,共享数据存储在实例变量中。
2) 实例化:每次调用,并发:多个,共享数据存储在静态变量中。
有什么实际区别吗?无论哪种方式,我都必须确保共享数据是线程安全的,但我想知道一种特定方法是否有任何优势。
【问题讨论】:
标签: c# wcf concurrency instances
假设我有一个 WCF 服务,它可以访问在多个客户端之间共享的某些数据。这两种设置有什么区别:
1) 实例化:单个,并发:多个,共享数据存储在实例变量中。
2) 实例化:每次调用,并发:多个,共享数据存储在静态变量中。
有什么实际区别吗?无论哪种方式,我都必须确保共享数据是线程安全的,但我想知道一种特定方法是否有任何优势。
【问题讨论】:
标签: c# wcf concurrency instances
理论上,没有区别。正如您所说,无论哪种方式,您都必须同步对共享数据的访问。实际上,第二种选择更好。来自关于 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();
}
}
显然,我省略了许多细节,但这表明了大体思路。
【讨论】: