Estoy repasando un libro de desarrollo general de C#, y he llegado a la sección abortar el hilo.¿Cuál es el problema con el lanzamiento oculto al capturar una ThreadAbortException?
El libro dice algo así como que cuando llamas a Thread.Abort() en otro hilo, ese hilo lanzará una ThreadAbortException, e incluso si intentas suprimirlo automáticamente lo volvería a lanzar, a menos que hayas hecho bs eso es generalmente desaprobado. Aquí está el simple ejemplo ofrecido.
using System;
using System.Threading;
public class EntryPoint
{
private static void ThreadFunc()
{
ulong counter = 0;
while (true)
{
try
{
Console.WriteLine("{0}", counter++);
}
catch (ThreadAbortException)
{
// Attempt to swallow the exception and continue.
Console.WriteLine("Abort!");
}
}
}
static void Main()
{
try
{
Thread newThread = new Thread(new ThreadStart(EntryPoint.ThreadFunc));
newThread.Start();
Thread.Sleep(2000);
// Abort the thread.
newThread.Abort();
// Wait for thread to finish.
newThread.Join();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
}
El libro dice:
Cuando el hilo termina de procesar la excepción de aborto, el tiempo de ejecución implícita relanzamientos que al final de su manejador de excepciones. Es lo mismo que si hubieras vuelto a tirar la excepción tú mismo. Por lo tanto, cualquier manejador externo de excepciones o finalmente bloques se ejecutarán normalmente. En el ejemplo, la llamada a Join no estará esperando para siempre como se esperaba inicialmente.
Así que envolví una captura de intento alrededor de la llamada Thread.Abort() y establecí un punto de ruptura esperando que tocara esto, teniendo en cuenta que el texto dice "cualquier manejador externo de excepción o finalmente bloqueará ejecutarse normalmente". PERO NO LO HACE Estoy trabajando en mi cerebro para descubrir por qué.
¿Alguien tiene alguna idea sobre por qué este no es el caso? Es el libro mal?
Gracias de antemano.
¿Qué produce su programa? –
Espero que el libro también mencione que Thread.Abort es malo y nunca debería usarse. –
aproximadamente 20 segundos de escribir tantos # como sea posible, luego ¡Abortar !, luego vuelve. – priehl