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ę? :)
wierzę jego chwili gdy kończy aplikacji (wzdłuż z resztą statyki) (zakładając, że referencja nie zostanie usunięta) – Sayse
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 –
jak twój kod dotyczy: Nigdy. I to nie powinno mieć znaczenia dla ciebie. Kiedy martwisz się o Dispose (! = Collect), zapytaj o to. –