2013-08-19 4 views
5

У меня есть некоторый SomeSingleton класс в C# (.NET 3.5, если это имеет значение) и код:Когда сборщик мусора соберет Синглтон?

foo() 
{ 
    ... 
    SomeSingleton.Instance.DoSomething(); 
    ... 
} 

Мой вопрос: когда будет сборщика мусора собрать этот объект Singleton?

p.s: код SomeSingleton:

private static SomeSingleton s_Instance = null; 
    public static SomeSingleton Instance 
    { 
     get 
     { 
      if (s_Instance == null) 
      { 
       lock (s_InstanceLock) 
       { 
        if (s_Instance == null) 
        { 
         s_Instance = new SomeSingleton(); 
        } 
       } 
      } 
      return s_Instance; 
     } 
    } 

Спасибо за помощь!

EDIT (с объяснением):

В Widnows услуг У меня есть код:

... 
    FirstSingleton.Instance.DoSomething(); 
    ... 

public class FirstSingleton 
{ 
    (Instance part the same as in SomeSingleton) 
    public void DoSomething() 
    { 
     SomeSingleton.Instance.DoSomething(); 
    } 
} 

То, что я хочу добиться: меня не волнует, что происходит с FirstSingleton, но SomeSingleton запускает таймер с его первым использованием, поэтому мне нужно, чтобы SomeSingleton существовал (так что таймер может запускать новый поток каждый период времени), пока работает моя служба.

Как я понимаю из ваших ответов, все это произойдет, потому что ссылка на мой FirstSingleton и SomeSingleton статична, и одиночные игры не будут собираться GC до тех пор, пока служба не перестанет работать, верно? :)

+1

Я считаю, что его, когда приложение заканчивается (вдоль с остальной статикой) (при условии, что ссылка не удалена) – Sayse

+0

Это никогда не будет собирать мусор, пока и до тех пор, пока вы не установите 's_Instance' в' null', и у вас нет других ссылок того же –

+3

. как ваш код: Никогда. И это не имеет значения для вас. Когда вы беспокоитесь об Dispose (! = Collect), спросите об этом. –

ответ

1

Объекты, на которые ссылаются статические переменные, будут собирать только мусор, когда соответствующий AppDomain собирает мусор. В клиентских приложениях часто присутствует только один AppDomain, который живет на протяжении всего процесса. (Исключением является, когда приложение использует плагин в архитектуре - разн. Подключаемые модули могут быть загружены в различных AppDomains и AppDomain может быть выгружен позже)

Refer