2010-07-16 15 views
21

Me gustaría poder nombrar un BackgroundWorker para que sea más fácil de depurar. es posible?Nombrando BackgroundWorker

+3

Como señaló Jonathan en el comentario sobre la respuesta aceptada, esto presenta un riesgo * real * de causar confusión, al poner un nombre en un hilo que luego se reutiliza para otra cosa. No es tu hilo; no intentes nombrarlo Si desea un hilo con nombre, cree uno propio (en lugar de utilizar 'BackgroundWorker'). –

Respuesta

29

Tendría que intentar pero ¿no puedes simplemente configurar el Name del hilo en el método DoWork() ejecutado por el BackgroundWorker?

ACTUALIZACIÓN: Me acaba de intentar la siguiente línea de código como la primera declaración del método DoWork() mis BackgroundWorkers y funciona:

if (Thread.CurrentThread.Name == null) 
    Thread.CurrentThread.Name = "MyBackgroundWorkerThread"; 

ACTUALIZACIÓN: Como Jonathan Allen declaró correctamente el nombre de un hilo es escribir una vez, así que agregué una verificación nula antes de configurar el nombre. Un intento de escribir el nombre por segunda vez daría como resultado una InvalidOperationException. Como Marc Gravell escribió también podría dar a la depuración más difícil tan pronto como hilos de fondo agrupados son reutilizados para otros trabajos, por lo que las discusiones de nombre sólo si es necesario ..

+4

Creo que eso es peligroso. Solo puede establecer el nombre en un hilo una vez, pero los hilos que usan los trabajadores de fondo pueden reutilizarse. –

+2

Estoy de acuerdo con @Jonathan: si no es su hilo, no debería nombrarlo. –

0

puede asignar nombres a las discusiones en los "hilos" -window cuando está depurando en Visual Studio.

13
public class NamedBackgroundWorker : BackgroundWorker 
{ 
    public NamedBackgroundWorker(string name) 
    { 
     Name = name; 
    } 

    public string Name { get; private set; } 

    protected override void OnDoWork(DoWorkEventArgs e) 
    { 
     if (Thread.CurrentThread.Name == null) // Can only set it once 
      Thread.CurrentThread.Name = Name; 

     base.OnDoWork(e); 
    } 
} 
+0

Acabo de consultar con Reflector. BackgroundWorker.RunWorkerAsync usa subprocesos de grupo de subprocesos. Como el nombre de un hilo solo se puede establecer una vez, el código arrojará una excepción si usa el mismo hilo de subprocesos dos veces. –

+0

.NET 4.0 usa un tipo anidado "private delegate void WorkerThreadStartDelegate (argumento de objeto);" Y llaman a BeginInvoke, por lo que puedo ver que no usan ThreadPool, pero está en lo correcto, debería haber comprobado si el Nombre era nulo antes de configurarlo. – XIU

1

Se puede extender el trabajador de fondo a través de una clase personalizada:

`

public class NamedBackgroundWorker : BackgroundWorker 
{ 

    public string Name; 

    public BackgroundWorker(string Name) 
    { 
     this.Name = Name; 
    } 
} 

` Ahora acaba de crear un objeto a partir de esto y puede que el nombre y utilizarlo como un fondo obrero.

+1

Esta respuesta es la misma que la respuesta anterior de XIU, pero con una explicación un poco mejor – Jmons