Время жизни синглтона - PullRequest
       17

Время жизни синглтона

5 голосов
/ 24 февраля 2012

Я создаю WCF-Сервис , который размещен в Windows Service . Служба WCF вызывается приложением ASP.Net с использованием прокси.

using (WcfServiceRef.MonitorClient proxy = new WcfServiceRef.MonitorClient())
{
    //WCF Service proxy
    proxy.Open();
    proxy.DoSomething();
}

Кроме того, у меня есть класс Singleton DataAdapter , который используется в WCF-сервисе следующим образом (большую часть времени он просто перенаправляет вызов в DataAdapter, чтобы иметь возможность изменить реализацию фактического доступ к данным легко):

DataAdapter.GetInstance().DoSomething();

Мой DataAdapter выглядит следующим образом и содержит данные myData, которые должны поддерживаться в рабочем состоянии:

public static DataAdapter DataAdapterInstance;
    private List<CustomObjects> myData;

    internal static ServiceAdapter GetInstance()
    {
        if (DataAdapterInstance == null)
        {
            DataAdapterInstance = new DataAdapter();
        }
        return DataAdapterInstance;
    }

Теперь пришло время столкнуться с тем, с чем у меня возникли проблемы: (Я не уверен, что все, что я пишу здесь, правильно)

  • Служба Windows 'теоретически работает вечно (как и должно быть)
  • WCF-сервис запускается только когда он вызывается / создается моим прокси (из asp.net) * +1021 *

Когда мой DataAdapter (который содержит все мои данные) «умирает» ... так что я спрашиваю здесь, каково время жизни объекта, когда на него фактически нет ссылки. (я бы сказал, что он собирается, когда работает сборщик мусора) - Я думаю, что мой подход не слишком хорош, я был бы признателен за любые предложения о том, как хранить мои данные (желательно без использования БД или внешнего файла)

Спасибо, что заглянули в мою проблему!

Ответы [ 2 ]

7 голосов
/ 24 февраля 2012

Статические ссылки являются «корневыми» ссылками для GC, поэтому они «никогда» не умрут (до тех пор, пока AppDomain не будет выгружен)

2 голосов
/ 24 февраля 2012

Поскольку ваш DataAdapterInstance является статическим, он не будет собираться до тех пор, пока AppDomain, в который он загружен, не будет выгружен - что в большинстве случаев означает, что он будет собран только после закрытия вашего приложения.

...