В Java возможно переименование потоков. В .NET это не так. Это происходит потому, что имя это свойство, которое является однократной записи в классе Thread:Thread Renaming
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 позволяет нить переименовывать и большинство основных резьбовых структур, используемых в ОС поставляется в обеих платформах, я «Я склонен думать, что могу реально переименовать поток в C#, если я избегу определенного набора функций, которые: а) мне все равно или б) вообще не используют.
Есть ли у вас какие-либо идеи, почему переименование потоков является операцией однократной записи? Любая идея, если изменение названия что-то сломает?
Я попытался тест, где я переименовывать нить, как например:
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 его.
Причина, по которой мне нужно сделать это, заключается в том, что поток будет повторно использован и может использоваться другим компонентом, и я хочу обозначить это, если и когда произойдет ведение журнала, чтобы иметь конкретное имя потока, а не общее число.
Почему вы хотите переименовать -й читать? Кроме того, что Java может это сделать? – ChrisF
@ChrisF: см. Править выше. –
Достаточно справедливо, хотя вы можете получить 'LoggingThread' из' Thread', который предоставляет свойство read/write, называемое 'ThreadName', и использовать его вместо этого. Я знаю, что это дополнительное свойство, имеющее такое же значение, но оно делает то, что вы хотите, и не полагается на отражение, которое может сломаться. – ChrisF