微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

多线程单例WCF服务

如何解决多线程单例WCF服务

| Juval Lowry在他的《 WCF服务编程》一书中表达了对使用Singleton Services的担忧,因为这会影响性能。 在我的一个项目中,我正在使用如下声明的无状态单例WCF服务:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode = ConcurrencyMode.Multiple)]
public class FooService : IFoo
{
}
可通过httpsTransport从多个Silverlight客户端访问该服务。我之所以选择单例,是因为我认为当确实不需要GC时,无需为系统增加负担。我是否缺少某些东西,或者这不是实现无状态服务(如果不比PerCall实例化服务还快)的最有效方法?     

解决方法

        您不会丢失任何东西。如果您的服务类没有实例成员变量,该实例成员变量表示的状态显然可能会由于多线程访问而损坏,则无需担心。 我个人总是使用Single + Mulitple模式,因为我的所有状态总是来自缓存或SQL数据库或某些其他共享资源,在这些共享资源中,无论如何您都需要模式来防止并发。我从来没有发现我的服务中需要成员变量。静力学?也许可以,但是您仍然知道要保护他们。 现在,这是我对PerCall与Single的全部个人看法。另一方面,PerSession服务可以(很可能)在实例中维护状态,但是我个人没有写很多这样的东西,而在我极少数情况下,它们是ConcurrencyMode.Single。 请查看此MSDN文章,以获取有关差异的更多讨论和实际性能比较。模式。     ,        您的假设可能适用于为没有SSL的basicHttpBinding配置的WCF服务(请参阅此处以获取更多信息),但对于其他绑定则不太可能。尽管您的应用程序代码可能确实是无状态的和/或线程安全的,但是WCF在内部使用会话来在其他绑定中提供功能上的支持。这意味着每个请求只能处理一个会话,因为只有一个服务实例。 似乎选择单例模式是过早优化的一种情况。仅当您有确凿的需求时,才需要关注GC效率的优化。     ,        您希望避免单例的原因之一是因为通常您必须拥有一个共享资源,必须使线程安全。一旦这样做,就可以将服务调用堆积在串行队列中,因为在该关键部分一次只能允许一个调用。 由于您有一个无状态单身人士,因此这可能不会成为问题。但是,这会使以后发生这种事情变得容易。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。