Pregunta

editar: esto parece ser un punto de fricción, así que voy a sacarlo de la forma:

No estoy usando esto para la sincronización. El simple hecho de matar a las tareas de larga duración cuando ya no se hacen necesario / deseable.
Hipotéticamente : asumen estos hilos simplemente escribir en la consola (decir: "rosca 1"), dormir una longitud aleatoria, y luego salir. Si son abortadas, quiero que me informan con otra escritura de la consola (dicen: "hilo 1 abortado"). Y me gustaría ser capaz de saltar a para el código de cancelación si intento abortar antes de que se ejecuten, sin ninguna posibilidad de que el desempeño de sus funciones normales. Si se abortó durante el funcionamiento normal, por supuesto va a imprimir ambos.


Tengo un trozo de hilos deseo de correr con el fin, en sitios ASP .NET 2.0 se ejecuta con Visual Studio 2008 (ni idea de lo mucho que lo único que importa, pero no lo es), y pueden tener abortada-limpia -up de código que deben ejecutarse independientemente de la distancia a través de su tarea son. Así que hago un hilo como este:

Thread t = new Thread(delegate() {
   try { 
      /* do things */ 
      System.Diagnostics.Debug.WriteLine("try");
   }
   catch (ThreadAbortException) {
      /* cleanup */ 
      System.Diagnostics.Debug.WriteLine("catch");
   }
});

Ahora, si quiero abortar el conjunto de hilos de manera parcial a través, la limpieza puede ser todavía más deseable en la línea. Mirando a través de MSDN implica que puede .Abort () un hilo que no se ha iniciado, y luego .start () que, momento en el que recibirá la excepción y llevar a cabo con normalidad. O puede .join () el hilo abortado que esperar a que termine abortar. Es de suponer que se pueden combinar.

http://msdn.microsoft.com /en-us/library/ty8d3wta(v=VS.80).aspx
Esperar hasta que un mensaje ha abortado, puede llamar al método de incorporación en el hilo después de llamar al método de aborto, pero no hay garantía de que la espera va a terminar.
Si Abortar se llama en un hilo que no se ha iniciado, el hilo se interrumpirá cuando se llama Start. Si Abortar se llama en un hilo que está bloqueado o está durmiendo, el hilo se interrumpe y luego abortada.

Ahora, cuando depurar y paso a través de este código:

t.Abort(); // ThreadState == Unstarted | AbortRequested
t.Start(); // throws ThreadStartException: "Thread failed to start."
// so I comment it out, and
t.Join(); // throws ThreadStateException: "Thread has not been started."

En ningún momento qué veo ninguna salida, ni cualquier punto de ruptura ya sea en el bloque try o captura conseguir alcanzado.
Curiosamente, ThreadStartException no aparece como un posible lanzamiento de .start (), a partir de aquí: http://msdn.microsoft.com/en-us/library/a9fyxz7d (v = VS.80) .aspx (o cualquier otra versión)

Yo entiendo que esto podría ser evitado por tener un parámetro de inicio, que establece si el hilo debe saltar al código de limpieza, y renunciar a la llamada de aborto (que es probablemente lo que haré). Y I podría .start () del hilo, y luego .Abort () de ella. Pero como puede pasar una cantidad indeterminada de tiempo entre .start y .Abort, estoy considerando poco fiable, y la documentación parece que decir que mi método original debería funcionar.

Me estoy perdiendo algo? Es el mal documentación?

editar: ow. Y no se puede llamar .start (param) en un hilo no parametrizada (Inicio). ¿Hay una manera de saber si un hilo es parametrizada o no, aparte de ensayo y error? Veo una m_Delegate privada, pero nada público ...

¿Fue útil?

Solución

Cuando se utiliza ...

t.Abort();
t.Start();

... la InnerException del ThreadStartExcpetion contendrá el ThreadAbortExeption al igual que los estados de MSDN: ( si Abortar se llama en un hilo que no se ha iniciado, el hilo se interrumpirá cuando se llama Start )

Si se ejecuta ...

t.Start();
t.Abort();

... la ThreadAbortException nunca puede aparecer dentro porque el hilo no tuvo tiempo de comenzar antes de que se abortó.

Si el resultado es algo así como ...

t.Start();
Thread.Sleep(100);
t.Abort();

... el código de "limpieza" siempre debe ser ejecutado.

Si es necesario ejecutar la limpieza de código incluso si el hilo no se ha empezado a hacer nada una posible solución sería iniciar un método de limpieza junto con la convocatoria de aborto.

Por otra parte se debe tratar de evitar abortar hilos y utilizar diferentes técnicas (http://msdn.microsoft.com/en-us/library/ms228964.aspx)

Otros consejos

Me doy cuenta de lo que implicaba la documentación para usted, pero eso no es lo que sucede. Si anula un hilo y luego inicia, nunca se ejecutará en modo alguno. El CLR es lo suficientemente inteligente como para saber que el hilo-aborta son un negocio precario, y una oportunidad para saltar la ejecución del hilo, por tanto, en conjunto es que no debe perderse.

Tal vez hacer que su código de limpieza en una subrutina. Si los padres o aborta hilo sabe sobre el aborto, que llama el código de limpieza de forma explícita.

Tenga en cuenta que la noción de "limpieza" después de abortar un hilo de .NET, es para descargar el dominio de aplicación de las asambleas que ejecutaban el hilo abortado. Es otra forma de decir "no esperaba esto para limpiar bien." En primer lugar, siempre se debe buscar un diseño que no requiere hilos que abortan.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top