c#WebService杀死它所拥有的Singleton

时间:2015-09-01 19:51:40

标签: 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 Singleton Instance
{
    get
    {
        lock (_syncRoot)
        {
            if (_instance == null)
                _instance = new Singleton();

            return _instance;
            }
        }
    }
}

我将以这种方式实现的是,每个调用我的WebService的客户端都将其对象提供给单例的同一个实例。再次,这个单例并不比排队对象并在计时器滴答时处理它更多。

我面临的问题(现在仍然是),每次WebService终止时,Singleton都会被杀死。但是,我不确定是否会发生这种情况,因为Singleton的所有者正在被破坏或由于应用程序池设置给出的某些原因。 我试图让应用程序池在闲置时“始终运行”和“暂停”,而不是“按需”和“终止” - 没有成功: - /

为什么单身人士每次都会被杀掉?如何在WebService执行之间保持Singleton的实例存活?

1 个答案:

答案 0 :(得分:1)

  

为什么单身人士每次都会被杀掉?

您需要了解WCF如何管理服务instancing以了解其原因。默认情况下,WCF将在session-enabled binding上为每个客户端创建一个新的服务实例,如果不支持会话则每次调用。

这意味着,为处理客户端调用而调度的服务实例会将单例实例加载到内存中。但是,当客户端会话或单个调用(没有支持会话)完成时,实例将被卸载,这意味着您的单例也将被取消。

  

如何在WebService之间保持Singleton的实例存活   执行?

有两种方法可以做到这一点:

  1. 摆脱你的单身人士。使用后备数据存储来维护多个客户端调用的状态。
  2. 通过在服务实现声明中设置InstanceContextMode=InstanceContxtMode.Single,使用单例服务实例。
  3. 在选项1的两个选项中,这是因为单例服务实例通常是反模式,因为它们是do not scale,并且只应在没有替代时使用。

      

    ....考虑将排队功能实现到外部   组件,例如Windows服务,但为了简单起见   并且降低了复杂性我想在其中实现   WebService的

    好的,我认为问题的根源在哪里。有关ditributed系统的共同信念,可以说如下:

    • 简单=更少的组件,
    • 复杂=更多组件

    我会将这种信念修改为:

    • 简单=简单的组件,
    • 复杂=复杂的组件

    在我看来,您决定将计时器/排队要求嵌入到您的网络服务中会自动使您的组件变得复杂。

    我认为将从队列中读取的组件分解为另一个组件正是您需要做的!

    如果这对您来说是令人生畏的,那么我强烈建议您使用topshelf来管理您的Windows服务,这是一个免费的框架,它使服务的创建和部署变得非常简单。