2013-08-19 2 views
5

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? :)

+1

ritengo suoi quando termina l'applicazione (lungo con il resto della statica) (supponendo che il riferimento non sia rimosso) – Sayse

+0

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 –

+3

Per quanto riguarda come il tuo codice è interessato: mai. E questo non dovrebbe importarti. Quando ti preoccupi di Dispose (! = Raccogli), chiedi a tale proposito. –

risposta

1

Gli oggetti a cui fanno riferimento le variabili statiche vengono raccolti solo quando l'AppDomain pertinente viene sottoposto a garbage collection. Nelle applicazioni client, spesso c'è un solo AppDomain che dura per tutta la durata del processo. (Un'eccezione è quando l'applicazione utilizza un plug-in architettura -. Differente plug-in possono essere caricati in diverse AppDomain e il dominio di applicazione possono essere scaricati in seguito)

Refer