我使用Task
来在.NET中运行异步操作。
为了更好地使用Threads调试窗口,我想通过线程名称来识别当前正在运行的任务。但是,每个线程的Name
属性只能设置一次。所以第二次使用来自池的同一个线程,我得到一个运行时异常。
有没有办法解决这个问题?
答案 0 :(得分:4)
当您使用TaskCreationOptions.LongRunning
计划任务时,它会在自己的线程上运行,而不是ThreadPool中的线程,因此您可以安全地设置线程的名称。
使用此方法可能会对性能产生影响,因此我建议仅在调试期间使用它。此外,似乎以这种方式创建的线程数量不受限制(除了线程数量的全局限制),因此它不会像不使用此选项那样表现。
答案 1 :(得分:2)
有没有办法解决这个问题?
嗯,技术上是的。我的意思是你可以使用反射来设置名称。请参阅我的回答here了解如何操作。当然,我不建议通过反射为生产代码设置私有字段,但我想你可以逃脱它,因为你只想用它进行调试。
答案 2 :(得分:1)
在评论中注明Ani:并行任务窗口将为您提供所有现有任务状态的详细信息。这和Parallel Stacks工具窗口将为大多数任务调试提供更好的细节。
是否可以从线程池中为线程提供临时名称?
Thread.Name
允许你设置一个线程的名称,但是(如果我没记错的话)这只能为一个线程设置一次,而不是限制它对线程池线程的有用性(在线程池线程上运行的任务)。
答案 3 :(得分:0)
在线程以Thread.CurrentThread.Name开头的那一刻,您始终可以命名该线程。
//this is how you put the thread in the ThreadPool.
ThreadPool.QueueUserWorkItem(new WaitCallback(this.Handler), this);
//this is how you name the Thread
void Handler(object parameters)
{
Thread.CurrentThread.Name = "MyThreadName";
while(true)
{
}
}