En Java, es posible cambiar el nombre de los hilos. En .NET no lo es. Esto se debe a que el nombre es una propiedad que es de una sola escritura en la clase Thread:Cambio de nombre de hilo
public string Name
{
get
{
return this.m_Name;
}
[HostProtection(SecurityAction.LinkDemand, ExternalThreading=true)]
set
{
lock (this)
{
if (this.m_Name != null)
{
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_WriteOnce"));
}
this.m_Name = value;
InformThreadNameChangeEx(this, this.m_Name);
}
}
}
Teniendo en cuenta el hecho de que Java permite cambiar el nombre de la rosca y la mayor parte de las estructuras de hilos de base utilizados son OS-suministra en ambas plataformas, yo Me inclino a pensar que realmente podría cambiar el nombre de un hilo en C#, si evito un cierto conjunto de funcionalidades que a) No me importa o b) No uso en absoluto.
¿Tiene alguna idea de por qué el cambio de nombre de subprocesos es una operación de escritura única? ¿Alguna idea de si cambiar el nombre rompe algo?
He tratado de una prueba donde puedo cambiar el nombre del hilo como tal:
var t1 = new Thread(TestMethod);
t1.Name = "abc";
t1.Start();
t1.GetType().GetField("m_Name", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(t1, "def");
t1.GetType().GetMethod("InformThreadNameChangeEx", BindingFlags.NonPublic | BindingFlags.Static).Invoke(t1, new object[] { t1, t1.Name});
El resultado es que el nombre se cambió de hecho y esto se refleja en el otro código que utiliza este hilo. El fondo de esto es que necesito registrar cosas que hacen los hilos y la biblioteca de registro que uso (log4net) usa Thread.Name para especificar qué hilo hace qué acción. Gracias por adelantado.
EDITAR: Por favor, deje de sugerir cosas obvias! Sé cómo nombrar un hilo al inicio si estoy preguntando cómo RE-nombrarlo.
La razón por la que tengo que hacer esto, es que el hilo será reutilizado y puede ser utilizado por otro componente y quiero indicar esto, siempre y cuando haya un registro, para tener un nombre de hilo específico, en lugar de un número genérico.
¿por qué quiere cambiar de nombre a hread? ¿Aparte de porque Java puede hacerlo? – ChrisF
@ChrisF: ver la edición anterior. –
Bastante justo, aunque podrías derivar un 'LoggingThread' de' Thread' que expone una propiedad de lectura/escritura llamada 'ThreadName' y usar eso en su lugar. Sé que es una propiedad extra que tiene el mismo valor, pero hace lo que quiere y no depende de la reflexión, que puede romperse. – ChrisF