2013-04-15 2 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는 모두 내부 호출 속성이므로 값 수집은 프레임 워크 자체에서 처리됩니다. 그것들은 속성이 아니고 메서드이기 때문에 반복적 인 반복을 통해 루프에 넣지 않으면 신속하게 액세스 할 수 있다고 가정하는 것이 합리적입니다.

로깅에이 속성을 사용하는 것에 신경 쓰면 NLog와 같이 많이 사용되는 로깅 프레임 워크가 어떻게 사용되는지 살펴볼 수 있습니다. 밝혀졌지만 캐시하지 않고 직접 사용합니다 :

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