2012-02-23 26 views
12

Creo que los hilos de nombres son muy útiles cuando se depuran.¿Cómo se nombra un hilo que ejecuta una Tarea?

puedo ver ninguna manera de nombrar un hilo usando argumentos para Task.Factory.StartNew()

Por lo que es aceptable para nombrar el hilo de forma explícita en la tarea? por ejemplo:

private void MyFunc() 
{ 
    Task.Factory.StartNew(() => 
    { 
     Thread.CurrentThread.Name = "Foobulizer"; 
     Foobulize(); 
    }); 
} 

Sin embargo, aprecio que los hilos pueden ser reutilizados para diferentes tareas, por lo que habría que necesite restablecer explícitamente el nombre del hilo al final de la tarea? Esto se siente bastante raro, ¿entonces estoy pensando que esta es probablemente una mala idea, o hay una forma correcta de hacerlo?

Respuesta

14

No puede hacer esto ya que varias Tareas pueden compartir subprocesos individuales o múltiples depende del estado ThreadPool en un momento dado de tiempo. Básicamente Tarea no es un subproceso Esto es solo una abstracción de alto nivel para la operación asincrónica. Puede utilizar la propiedad Task.Id, pero tenga en cuenta que Id es de solo lectura y de int tipo, por lo que no puede asignar un nombre fácil de usar personalizado.

tarea IDs se asignan a la carta y no representan necesariamente el orden en los que Instancias de tareas fueron creados

Echa un vistazo a las construidas en Visual Studio 2010 funciones de depuración en paralelo, tal vez encontrará otro enfoque: Walkthrough: Debugging a Parallel Application

tareas paralelas ventana:

enter image description here

Para cada ejecución de tareas, se puede leer su ID, que es devuelto por la del mismo nombre propiedad, el ID y el nombre del hilo que lo dirige, su ubicación (se cierne sobre que muestra un texto de ayuda que tiene toda la pila de llamadas ). Además, debajo de la columna Tarea, puede ver el método que se pasó al en la tarea; en otras palabras, el punto de partida

+0

Puede usar el código como 'Task.CurrentId' en la acción o método relevante. –

5

El valor predeterminado TaskScheduler usa .NET ThreadPool para programar las tareas. Entonces obtendrá un hilo que ya existe o uno que será reutilizado (tanto potencial como probable).

Tenga en cuenta que solo puede nombrar un hilo una vez. El segundo intento de llamar al Thread.CurrentThread.Name elevará un InvalidOperationException. Esto es particularmente malo cuando se trata de un hilo de grupo de subprocesos.

En general, no debe cambiar los atributos de un hilo que no creó (explícitamente) o que posee (el nombre es uno, siendo el priority los otros candidatos destacados).

+0

No me di cuenta de que solo puedes nombrar una vez. Interesante, gracias. – GazTheDestroyer

-1

Claro que puede, simplemente elimine el Nombre nuevamente cuando haya terminado. vuelva a establecer el nombre del hilo en la cadena de mena "inactiva". Vacíe después de Foobulize();

+0

Esto es falso, no puede establecer Thread.Name más de una vez. –

Cuestiones relacionadas