我用Task
s到在.NET運行的異步操作。是否可以給線程池中的線程一個臨時名稱?
爲了更好地利用該線程調試窗口,我想通過一個線程名來識別當前運行的任務。但是,每個線程的Name
屬性只能設置一次。所以第二次使用池中的同一個線程時,我得到一個運行時異常。
有什麼辦法來解決這個問題?
我用Task
s到在.NET運行的異步操作。是否可以給線程池中的線程一個臨時名稱?
爲了更好地利用該線程調試窗口,我想通過一個線程名來識別當前運行的任務。但是,每個線程的Name
屬性只能設置一次。所以第二次使用池中的同一個線程時,我得到一個運行時異常。
有什麼辦法來解決這個問題?
由於Ani筆記在他的評論:並行任務窗口會給你現有的所有任務狀態的詳細信息。這和Parallel Stacks工具窗口將爲大多數任務調試提供更好的細節。
是否可以給線程池中的線程一個臨時名稱?
Thread.Name
允許您設置線程的名字,但(如果我沒有記錯),這隻能對單個線程,而限制了它的線程池中的線程(任務的線程池中的線程上運行)設置一次。
當您使用安排任務時,它將在自己的線程上運行,而不是線程池中的線程,因此您可以安全地設置線程的名稱。
使用這種方法將可能有表現的影響,所以我建議只在調試過程中使用它。此外,似乎以這種方式創建的線程數量不受限制(除了線程數量的全侷限制外),因此它不會像沒有使用此選項那樣運行。
有什麼辦法來解決這個問題?
當然,從技術上肯定的。我的意思是你可以用使用反射來設置名字。請參閱我的回答here瞭解如何操作。當然,我不建議通過反射來設置生產代碼的私有字段,但我想你可以逃避它,因爲你只是想用它進行調試。
您可以隨時名稱,線程開始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)
{
}
}
Name屬性是可寫,所以如果該名稱已被設置(通過線程池線程上運行一些其他的任務嗎?),它會拋出異常。 – Sam 2014-04-03 08:10:34
這不是直接回答你的問題,但你看了'調試 - >窗口 - >並行Tasks'窗口?它顯示了(除其他外):任務的狀態,其運行的線程的「Id」以及其目標方法。 – Ani 2011-05-08 08:39:30
我想知道爲什麼這個名字只能被設置一次?我可以理解爲一個必須唯一設置線程開始前(該系統可能產生一個GUID,如果其他人在沒有指定),但即使有人想每個線程有一個不變的名稱標識它的名字,它會有用於有一個可變的「描述」字段。任何想法爲什麼線程名稱/描述不可變? – supercat 2012-03-23 16:15:43