Ho semplificato l'esempio seguente per motivi di chiarezza, ma l'ho trovato in un programma di produzione dal vivo e non riesco a vedere come funzionerebbe!Cosa succede a un thread quando la classe originale esce dall'ambito
public class Test
{
static void Main()
{
Counter foo = new Counter();
ThreadStart job = new ThreadStart(foo.Count);
Thread thread = new Thread(job);
thread.Start();
Console.WriteLine("Main terminated");
}
}
public class Counter
{
public void Count()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Other thread: {0}", i);
Thread.Sleep(500);
}
Console.WriteLine("Counter terminated");
}
}
La routine principale avvia il thread contatore e termina la routine principale. Il contro thread continua indipendentemente dando il seguente output.
Main terminated
Other thread: 0
Other thread: 1
Other thread: 2
Other thread: 3
Other thread: 4
Other thread: 5
Other thread: 6
Other thread: 7
Other thread: 8
Other thread: 9
Counter terminated
Il mio programma di esempio dimostra che sebbene la classe chiamante non esista più, il thread sopravvive fino al completamento. Tuttavia, la mia comprensione è che una volta che una classe è fuori dal campo di applicazione, le sue risorse verranno riordinate alla fine dalla garbage collection.
Nel mio scenario di vita reale, il thread esegue un'e-mail di massa della durata di 1-2 ore. La mia domanda è "La raccolta di dati inutili può eventualmente eliminare il thread o GC sa che il thread è ancora in elaborazione"? Il mio thread di mailing è sempre in esecuzione o esiste un pericolo che si interrompa in modo anomalo?
* Tuttavia, la mia comprensione è che una volta che una classe è fuori portata, le sue risorse saranno eventualmente riordinate dalla garbage collection. * I thread sono un caso speciale ... Portano gli oggetti 'Thread'" dentro "loro stessi, nel 'Thread.CurrentThread', ** e ** il loro metodo corrente è considerato come un GC Root (quindi un punto di partenza per il GC per scoprire se un oggetto ha ancora riferimenti) ... Ma sì, è un ragionamento circolare. – xanatos
Le classi non escono dall'ambito. Gli oggetti non vanno oltre lo scopo. Le variabili escono dall'ambito di applicazione (che è facile da capire - tutto ciò significa che la variabile non esiste più. Se la variabile è un riferimento, non fa nulla all'oggetto a cui fa riferimento). – immibis