2013-04-15 44 views
1

沒有人有任何見解的反覆調用CurrentThread.ManagedThreadId或將值存儲在線程本地存儲中?

SystemThreading.Thread.CurrentThread.ManagedThreadId 

實施一樣,如果它做的內核往返與否?我特別想知道,如果調用它反覆從線程的衆多比從此讀取值一次,將其存儲在線程本地存儲,然後使用這個值,而不是更好,像

ThreadLocal<int> ThreadId = new ThreadLocal<int>(() => 
    Thread.CurrentThread.ManagedThreadId); 
... 
Tracer.Add("Thread:" + ThreadId.Value); 

我約來衡量這兩種變化都是現在的,但是認爲事先聽到任何想法(或偏見:)會很有趣。

回答

3

CurrentThread和ManagedThreadId都是內部調用屬性,所以value retreival是由框架本身處理的。既然它們是屬性,而不是方法,那麼假設它們可以被快速訪問並且不需要存儲它們是合理的,除非你讓它們處於一個有很多迭代的循環中。

public extern int ManagedThreadId 
{ 
    [__DynamicallyInvokable, ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), SecuritySafeCritical] 
    [MethodImpl(MethodImplOptions.InternalCall)] 
    get; 
} 

如果你關心有關使用該屬性的記錄,我們可以看看如何流行的日誌框架,像NLOG,使用它。原來,它沒有緩存它,並直接使用它:

namespace NLog.LayoutRenderers 
{ 
    public class ThreadIdLayoutRenderer : LayoutRenderer 
    { 
     protected override void Append(StringBuilder builder, LogEventInfo logEvent) 
     { 
      builder.Append(Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture)); 
     } 
    } 
}