2011-05-08 9 views
6

Yo uso Task s para ejecutar operaciones asincrónicas en .NET.¿Es posible dar un nombre temporal a un hilo del grupo de subprocesos?

Para hacer un mejor uso de la ventana de depuración de Threads, me gustaría identificar la tarea que se está ejecutando actualmente por un nombre de subproceso. Sin embargo, la propiedad Name de cada subproceso solo se puede establecer una vez. Entonces, la segunda vez que se usa el mismo hilo del grupo, recibo una excepción de tiempo de ejecución.

¿Hay alguna forma de evitar esto?

+4

Esta no es una respuesta directa a su pregunta, pero ¿ha mirado en la ventana 'Debug -> Windows -> Parallel Tasks'? Muestra (entre otras cosas): el estado de una tarea, el 'Id' del hilo en el que se ejecuta y su método objetivo. – Ani

+3

Me pregunto por qué el nombre se limita a establecerse una vez? Pude entender que un nombre tenía que establecerse de forma única antes de que se iniciara un hilo (con el sistema tal vez generando un GUID si no se especificaba nada más), pero incluso si uno quisiera que cada hilo tuviera un nombre inmutable que lo identificara, sería útil para tener un campo de "descripción" mutable. ¿Alguna idea de por qué los nombres y las descripciones de los hilos no son mutables? – supercat

Respuesta

1

Como Ani notas en su comentario: Parallel Tasks Window le dará detalles del estado de todas las tareas existentes. Esta y la ventana de herramientas de Parallel Stacks proporcionarán un mejor detalle para la mayoría de las tareas de depuración.

¿Es posible dar un nombre temporal a un hilo del grupo de subprocesos?

Thread.Name le permite configurar el nombre de un hilo, pero (si no recuerdo mal) esto sólo se puede establecer de una vez por un solo hilo y no limitar su utilidad para las discusiones grupo de subprocesos (tareas se ejecutan en subprocesos de grupo de hilos).

4

Cuando programa sus tareas con el TaskCreationOptions.LongRunning, se ejecuta en su propio hilo, no en un hilo del ThreadPool, por lo que puede establecer con seguridad el nombre del hilo.

El uso de este método probablemente tendrá un impacto en el rendimiento, por lo que sugeriría usarlo solo durante la depuración. Además, parece que el número de subprocesos creados de esta manera no está limitado (aparte de los límites globales en el número de subprocesos), por lo que no se comportará igual que sin usar esta opción.

2

¿Hay alguna forma de evitar esto?

Bueno, técnicamente sí. Quiero decir que podría usar la reflexión para establecer el nombre. Vea mi respuesta here para saber cómo hacerlo. Naturalmente, no recomiendo establecer campos privados a través de la reflexión para el código de producción, pero supongo que puede salirse con la suya ya que solo quiere usarlo para la depuración.

0

Siempre puede nombrar el hilo en el momento en que el hilo comienza con Thread.CurrentThread.Name.

//this is how you put the thread in the ThreadPool. 
ThreadPool.QueueUserWorkItem(new WaitCallback(this.Handler), this); 


//this is how you name the Thread 
void Handler(object parameters) 
{ 
    Thread.CurrentThread.Name = "MyThreadName"; 
    while(true) 
    { 

    } 
} 
+1

La propiedad Name es WriteOnce, por lo que si el nombre ya estaba establecido (¿por alguna otra tarea ejecutándose en subprocesos de ThreadPool?) Generará una excepción. – Sam

Cuestiones relacionadas