Wszystko, co przeczytałem, twierdzi, że przerwano wątek, spowoduje wykonanie bloku finally przed zakończeniem wyjątku ThreadAbortException. Chciałem to potwierdzić, abym mógł zaplanować obsługę kodu innej firmy, który może zawieszać się w nieskończoność. Jednak następujący test mnie mylić:Czy ThreadAbortException może w końcu przejść?
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());
}
Co znajdę, gdy uruchomiony jest to, że konsola nie wspomina wprowadzając wreszcie zablokować. Aplikacja będzie kontynuowana po wywołaniu .abort, tak jakby w ogóle nie było żadnego bloku końcowego. czy robię coś źle? Czy nie powinno się kontrolować przechodzenia do bloku końcowego przed osiągnięciem ostatecznego zapisu na konsolę, czy kolejność wykonania nadal jest funkcją faktu, że ostatecznie znajduje się w osobnym wątku czy coś takiego?
Uruchomiłem kod i otrzymałem "wątek testowy wprowadzony WRESZCIE o 15:21". – Romoku
Nie wypróbowany, ale podejrzewam, że kod będzie zachowywał się inaczej między debugowaniem i wersją/brakiem dołączonych konfiguracji debuggera jako nieskończonej pętli, która może być JITed w coś, co nie może zostać przerwane w kompilacji wydania. –
Wywołanie "Thread.Abort' jest jak zatrzymanie samochodu przez wystrzelenie sterownika w głowę. Samochód się zatrzyma, ale nie wiadomo, co może się stać w międzyczasie. Naprawdę nie powinieneś * nigdy * potrzebować połączenia z "Thread.Abort". Jeśli to zrobisz, musisz ponownie przejrzeć projekt aplikacji. –