在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来指定哪个线程执行哪个操作.提前致谢.
编辑:请停止建议明显的事情!如果我问如何重命名它,我知道如何在开始时命名一个线程.
我需要这样做的原因是,线程将被重用,并且它可能被另一个组件使用,我想表示这个,如果有时会发生日志记录,以便有一个特定的线程名称而不是通用数字.
据我所知,我有一些误导性的信息.我需要在后台运行一个单独的线程.
目前我这样做:
var task = Task.Factory.StartNew
(CheckFiles
, cancelCheckFile.Token
, TaskCreationOptions.LongRunning
, TaskScheduler.Default);//Check for files on another thread
private void CheckFiles()
{
while (!cancelCheckFile.Token.IsCancellationRequested)
{
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
这总是为我创建一个新线程.但经过多次讨论后,即使将其标记为LongRunning也无法保证将创建新的线程.
在过去我做过这样的事情:
thQueueChecker = new Thread(new ThreadStart(CheckQueue));
thQueueChecker.IsBackground = true;
thQueueChecker.Name = "CheckQueues" + DateTime.Now.Ticks.ToString();
thQueueChecker.Start();
private void CheckQueue()
{
while (!ProgramEnding)
{
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
你会建议我回到这种方法来保证使用新线程吗?
当我创建一个任务时
Task task = Task.Factory.StartNew(() => someMethod(args));
Run Code Online (Sandbox Code Playgroud)
在C#4.0+中,我如何获得此任务的线程的引用?
是否可能在创建任务的同一线程中执行任务或生成多个线程?
更新:
原因是:
创建的任务是否始终在与创建任务的线程不同的线程中执行?
它是一个,零个还是多个线程?
它是在同一个核心上执行的吗?
重要的是要知道,因为,例如,我可以睡觉主线程,认为我冻结后台工作人员
更新:
有用的答案: