Ho alcuni SomeSingleton
classe in C# (.NET 3.5 se è importante) e il codice:Quando il garbage collector raccoglierà un Singleton?
foo()
{
...
SomeSingleton.Instance.DoSomething();
...
}
La mia domanda è: quando sarà Garbage Collector di raccogliere questo oggetto Singleton?
P.S: codice di 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;
}
}
Grazie per l'aiuto!
EDIT (con spiegazione):
In Widnows Servizio Ho codice:
...
FirstSingleton.Instance.DoSomething();
...
public class FirstSingleton
{
(Instance part the same as in SomeSingleton)
public void DoSomething()
{
SomeSingleton.Instance.DoSomething();
}
}
Quello che voglio ottenere: Non mi interessa ciò che accade con FirstSingleton, ma SomeSingleton inizia Timer con il primo utilizzo di esso, quindi ho bisogno di SomeSingleton per esistere (quindi il timer può eseguire il nuovo thread ogni periodo di tempo) fino a quando il mio servizio è in esecuzione.
Come ho capito dalle vostre risposte, tutto ciò accadrà perché il riferimento a FirstSingleton e SomeSingleton è statico e i singleton non verranno raccolti da GC finché il servizio non si interrompe, vero? :)
ritengo suoi quando termina l'applicazione (lungo con il resto della statica) (supponendo che il riferimento non sia rimosso) – Sayse
Non sarà mai raccolto a meno che e fino a quando non si imposta 's_Instance' su' null' e non si hanno altri riferimenti dello stesso –
Per quanto riguarda come il tuo codice è interessato: mai. E questo non dovrebbe importarti. Quando ti preoccupi di Dispose (! = Raccogli), chiedi a tale proposito. –