c#WebService杀死了它所拥有的Singleton
我有一个WebService,它拥有一个Singleton:c#WebService杀死了它所拥有的Singleton,c#,wcf,singleton,C#,Wcf,Singleton,我有一个WebService,它拥有一个Singleton: public class WebService { private static Singleton _singleton = Singleton.Instance; public void DoSomeJob(object jobObj) { _singleton.QueueJob(jobObj); } } 。。和Singleton,它应该是线程安全的 public static Sing
public class WebService
{
private static Singleton _singleton = Singleton.Instance;
public void DoSomeJob(object jobObj) {
_singleton.QueueJob(jobObj);
}
}
。。和Singleton,它应该是线程安全的
public static Singleton Instance
{
get
{
lock (_syncRoot)
{
if (_instance == null)
_instance = new Singleton();
return _instance;
}
}
}
}
我要通过这种方式实现的是,每个调用我的Web服务的客户机都将其对象提供给同一个singleton实例。同样,这个单例只不过是将对象排队并在计时器滴答作响时对其进行处理
我曾经(现在仍然)面临的问题是,每当Web服务终止时,单身汉就会被杀死。但是,我不确定这是否是因为Singleton的所有者正在被破坏,或者是由于应用程序池设置给出的某些原因。
我尝试使应用程序池在空闲时“始终运行”和“暂停”,而不是“按需”和“终止”-没有成功:-/
为什么单身汉每次都被杀?如何在WebService执行之间保持Singleton实例的活动性
为什么单身汉每次都被杀
您需要了解WCF是如何管理服务的,才能理解这是为什么。默认情况下,WCF将通过每个客户端创建一个新的服务实例,如果不支持会话,则每次调用都会创建一个新的服务实例
这意味着为处理客户端调用而分配的服务实例将把单例实例加载到内存中。但是,当客户端会话或单个调用(不支持会话)完成时,实例将被卸载,这意味着您的单例也将被卸载
如何在WebService之间保持Singleton实例的活动
处决
有两种方法可以做到这一点:
InstanceContextMode=InstanceContextMode.Single
,使用单例服务实例李>
在两个选项中,我选择选项1。这是因为单例服务实例通常是反模式的,因为它们只有在没有其他选择时才应该使用
..考虑将排队功能实施到外部
组件,例如windows服务,但为了简单起见
降低了复杂性,我希望在
网络服务
好的,我认为你的问题就在这里。关于分布式系统有一个共同的信念,可以表述为:
- 简单=更少的组件,以及
- 复杂=更多组件
- 简单=简单组件,以及
- 复杂=复杂组件
如果这让您感到畏惧,那么我强烈建议您使用来管理windows服务,这是一个免费的框架,它使服务的创建和部署非常简单 事实上,我的帖子是以“大家好”开头的,但一定是被剪掉了——请原谅:)小心那些锁。并发请求将锁定在该代码段上。我知道这是你想要的,但是并发请求应该是独立的,而不是排队等待。如果线程安全的集合是你想要的,那么试试看:@mitch FYI,Stackoverflow的礼仪是以FAQ的方式写你的帖子,而不是论坛帖子或给其他网站用户的信。我在编辑你的问题时就考虑到了这点。@Mihai:谢谢你的链接!然而,您能指出为什么并发请求不应该排队等待吗?我必须承认我真的不明白。非常感谢你详细的回答,汤姆!关于你的选择,我完全同意。虽然我不知道选项2是一个已知的“反模式”,但在我写帖子之前,我已经决定反对这个解决方案。在我看来,没有理由让服务实例一直保持活动状态。这样做是一个快速的解决方案,但也是一个肮脏的解决方案。但是,选项1似乎也不是一个有效的解决方案,因为singleton不用于跨不同请求共享数据。单例应该用来保持计时器运行..@mitch-Hmm我明白了。你能再解释一下这个计时器的作用吗?当然。每个服务客户机都应该给singleton一个对象。singleton应该将此对象添加到队列中。在上述计时器的每一次滴答声中,该队列的前x个对象都应该被处理。我还考虑将排队功能实现到外部组件,例如windows服务,但为了简单和降低复杂性,我希望在Web服务中实现该功能。我明白你的观点,Tom,我在某种程度上同意你的观点。我的基本想法是,排队和处理对象只在web服务运行时相关。这就是为什么我要将排队功能直接作为web服务的一部分来实现的原因。将该功能外包给外部组件也意味着,即使web服务没有运行,或者没有要处理的对象,计时器也在运行。为了避免这种情况,我必须使这两个组件相互协调,以此类推。。评论太长了。非常感谢!:-)@mitch-排队和处理对象只在web服务运行时相关-如何定义“相关”?我不明白你在这里的理由。当web服务未运行时,排队和处理组件上将没有活动。