在Java中,可以重命名线程.在.NET中它不是.这是因为Name是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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
鉴于Java允许线程重命名并且所使用的大多数底层线程结构都是在两个平台上提供操作系统,我倾向于认为我实际上可以在C#中重命名线程,如果我避免使用某些功能)我不在乎或b)根本不使用.
你知道为什么Thread重命名是一次写入操作吗?如果更改名称有什么想法吗?
我尝试过一个测试,我将线程重命名为:
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});
Run Code Online (Sandbox Code Playgroud)
结果是名称确实已更改,这反映在使用此线程的其他代码上.这样做的背景是我需要记录线程所做的事情以及我使用的日志库(log4net)使用Thread.Name来指定哪个线程执行哪个操作.提前致谢.
编辑:请停止建议明显的事情!如果我问如何重命名它,我知道如何在开始时命名一个线程.
我需要这样做的原因是,线程将被重用,并且它可能被另一个组件使用,我想表示这个,如果有时会发生日志记录,以便有一个特定的线程名称而不是通用数字.