2011-05-08 40 views
6

我用Task s到在.NET運行的異步操作。是否可以給線程池中的線程一個臨時名稱?

爲了更好地利用該線程調試窗口,我想通過一個線程名來識別當前運行的任務。但是,每個線程的Name屬性只能設置一次。所以第二次使用池中的同一個線程時,我得到一個運行時異常。

有什麼辦法來解決這個問題?

+4

這不是直接回答你的問題,但你看了'調試 - >窗口 - >並行Tasks'窗口?它顯示了(除其他外):任務的狀態,其運行的線程的「Id」以及其目標方法。 – Ani 2011-05-08 08:39:30

+3

我想知道爲什麼這個名字只能被設置一次?我可以理解爲一個必須唯一設置線程開始前(該系統可能產生一個GUID,如果其他人在沒有指定),但即使有人想每個線程有一個不變的名稱標識它的名字,它會有用於有一個可變的「描述」字段。任何想法爲什麼線程名稱/描述不可變? – supercat 2012-03-23 16:15:43

回答

1

由於Ani筆記在他的評論:並行任務窗口會給你現有的所有任務狀態的詳細信息。這和Parallel Stacks工具窗口將爲大多數任務調試提供更好的細節。

是否可以給線程池中的線程一個臨時名稱?

Thread.Name允許您設置線程的名字,但(如果我沒有記錯),這隻能對單個線程,而限制了它的線程池中的線程(任務的線程池中的線程上運行)設置一次。

4

當您使用​​安排任務時,它將在自己的線程上運行,而不是線程池中的線程,因此您可以安全地設置線程的名稱。

使用這種方法將可能有表現的影響,所以我建議只在調試過程中使用它。此外,似乎以這種方式創建的線程數量不受限制(除了線程數量的全侷限制外),因此它不會像沒有使用此選項那樣運行。

2

有什麼辦法來解決這個問題?

當然,從技術上肯定的。我的意思是你可以用使用反射來設置名字。請參閱我的回答here瞭解如何操作。當然,我不建議通過反射來設置生產代碼的私有字段,但我想你可以逃避它,因爲你只是想用它進行調試。

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) 
    { 

    } 
} 
+1

Name屬性是可寫,所以如果該名稱已被設置(通過線程池線程上運行一些其他的任務嗎?),它會拋出異常。 – Sam 2014-04-03 08:10:34

相關問題