В Java возможно переименование потоков. В .NET это не так. Это связано с тем, что Имя является свойством, которое однократно записывается в классе Thread:
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);
}
}
}
Учитывая тот факт, что Java разрешает переименование потоков и большинство используемых структур нитей, поставляемых ОС на обеих платформах, я склонен думать, что могу фактически переименовать поток на С#, если я избегу определенного набора функциональность, которая: а) мне все равно или б) вообще не использовать.
Есть ли у вас какие-либо идеи, почему переименование потоков является операцией однократной записи? Любая идея, если изменение названия что-то сломает?
Я пробовал тест, где я переименовал поток как таковой:
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});
Результат состоит в том, что имя действительно изменено, и это отражается на другом коде, который использует этот поток. Основой этого является то, что мне нужно записывать то, что делают потоки, а библиотека протоколирования, которую я использую (log4net), использует Thread.Name, чтобы указать, какой поток выполняет какое действие. Спасибо заранее.
EDIT: Пожалуйста, прекратите предлагать очевидные вещи! Я знаю, как назвать поток при запуске, если я спрашиваю, как RE-name.
Причина, по которой мне нужно это сделать, заключается в том, что поток будет повторно использован и может использоваться другим компонентом, и я хочу обозначить это, если и когда будет происходить ведение журнала, чтобы иметь конкретное имя потока, а не общее число.