Tutto ciò che ho letto afferma che un abort su un thread eseguirà il blocco finally prima di terminare da un ThreadAbortException. Volevo confermarlo, così posso pianificare come gestire un codice di terze parti che può essere sospeso indefinitamente. Tuttavia il seguente test mi ha confuso:È possibile ignorare ThreadAbortException?
public void runTest(DateTime deadline)
{
testThread = new Thread(() =>
{
try
{
Console.WriteLine("test thread started at " + DateTime.Now.ToShortTimeString());
while (true) { }
}
finally
{
Console.WriteLine("test thread entered FINALLY at " + DateTime.Now.ToShortTimeString());
while (true) { }
}
});
testThread.Start();
while (testThread.IsAlive && deadline.Subtract(DateTime.Now).TotalSeconds > 0)
{
Console.WriteLine("main thread while loop " + DateTime.Now.ToShortTimeString());
Thread.Sleep(10000);
}
if (testThread.IsAlive)
testThread.Abort();
Console.WriteLine("main thread after abort call " + DateTime.Now.ToShortTimeString());
}
Quello che ho trovato durante l'esecuzione di questo è che console mai cita entrare nel blocco finally. L'applicazione continua dopo la chiamata .abort come se non ci fosse alcun blocco finale. Sto facendo qualcosa di sbagliato? Non dovresti controllare il passaggio al blocco finally prima di raggiungere la scrittura finale in console o l'ordine di esecuzione è ancora una funzione del fatto che alla fine si trova in una discussione separata o qualcosa del genere?
Ho eseguito il codice e ho ottenuto 'thread di test inserito FINALMENTE alle 3:21 PM'. – Romoku
Non provato, ma ho il sospetto che il codice si comporterà in modo diverso tra debug e release/no debugger configurate come loop infinito che potrebbe essere JITed in qualcosa che non può essere interrotto in release build. –
Chiamare 'Thread.Abort' è come fermare una macchina sparando al guidatore in testa. L'auto si fermerà, ma non si sa cosa potrebbe succedere nel frattempo. Non dovresti * assolutamente * aver bisogno di chiamare 'Thread.Abort'. Se lo fai, allora hai bisogno di rivisitare il design della tua applicazione. –