2013-08-19 8 views
5

Mam SomeSingleton klasy w języku C# (.NET 3.5, jeśli ma to znaczenie) i kod:Kiedy zbieracz śmieci zbierze Singleton?

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

Moje pytanie brzmi: kiedy Garbage Collector zebrania tego obiektu Singleton?

p.s: Kodeks 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; 
     } 
    } 

Dzięki za pomoc!

EDIT (z wyjaśnieniem):

W Widnows Służby mam kod:

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

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

Co chcę osiągnąć: Nie dbam o to, co dzieje się z FirstSingleton, ale SomeSingleton uruchamia timer przy pierwszym użyciu, więc potrzebuję SomeSingleton do istnienia (aby timer mógł uruchamiać nowy wątek w każdym okresie), o ile moja usługa jest uruchomiona.

Jak rozumiem z twoich odpowiedzi, wszystko to się wydarzy, ponieważ odwołanie do mojego FirstSingleton i SomeSingleton jest statyczne, a singletony nie będą gromadzone przez GC dopóki usługa się nie skończy, mam rację? :)

+1

wierzę jego chwili gdy kończy aplikacji (wzdłuż z resztą statyki) (zakładając, że referencja nie zostanie usunięta) – Sayse

+0

To nigdy nie będzie zbiorem śmieci, dopóki i dopóki nie ustawisz 's_Instance' na' null' i nie będziesz miał żadnych innych odniesień tego samego –

+3

jak twój kod dotyczy: Nigdy. I to nie powinno mieć znaczenia dla ciebie. Kiedy martwisz się o Dispose (! = Collect), zapytaj o to. –

Odpowiedz

1

Obiekty przywoływane przez zmienne statyczne będą usuwane tylko wtedy, gdy odpowiednia AppDomain nie będzie zbierana. W aplikacjach klienckich często istnieje tylko jedna AppDomena, która działa przez cały czas trwania procesu. (Wyjątkiem jest sytuacja, gdy aplikacja jest wykorzystywany moduł w architekturze. - różne wtyczki mogą być ładowane w różnych AppDomains i AppDomain mogą być rozładowywane później)

Refer