Questo mi ha effettivamente morso un paio di volte. Se fai un codice semplice come questo:Manca la perdita in. Net threads
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 1000000; i++)
{
Thread CE = new Thread(SendCEcho);
CE.Priority = ThreadPriority.Normal;
CE.IsBackground = true;
CE.Start();
Thread.Sleep(500);
GC.Collect();
}
}
private void SendCEcho()
{
int Counter = 0;
for (int i = 0; i < 5; i++)
{
Counter++;
Thread.Sleep(25);
}
}
Esegui questo codice e guarda le maniglie volare! Thread.Sleep è così puoi spegnerlo e non prendere il controllo del tuo computer. Questo dovrebbe garantire che il thread lanciato muoia prima dell'avvio del thread successivo. Chiamando GC.Collect(); non fa nulla. Dalla mia osservazione questo codice perde 10 handle ogni aggiornamento al task manager al normale aggiornamento.
Non importa ciò che è nella funzione SendCEcho() del vuoto, contare fino a cinque se si desidera. Quando il filo muore, c'è una maniglia che non viene pulita.
Con la maggior parte dei programmi questo non ha molta importanza perché non vengono eseguiti per lunghi periodi di tempo. Su alcuni dei programmi che ho creato devono essere eseguiti per mesi e mesi.
Se si esercita questo codice più e più volte, è possibile perdere le maniglie fino al punto in cui il sistema operativo Windows diventa instabile e non funzionerà. Riavvio richiesto.
ho risolto il problema utilizzando un pool di thread e il codice come questo:
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadJobMoveStudy));
La mia domanda però è perché c'è una tale perdita in .Net, e perché è esistito così a lungo? Dal momento che come 1.0? Non sono riuscito a trovare la risposta qui.
Come stai visualizzando le maniglie? –
@Yacoub In Windows Task Manager. Graverà seriamente tutte le maniglie disponibili e renderà instabile il sistema operativo. – Jake
@ pm100 .net mi consente di farlo. Ci sono un sacco di tutorial che mostrano di fare threading come questo. Prometto che se si esegue questo codice più e più volte, non mettendo nulla nella funzione void, si renderà instabile il sistema operativo. – Jake