1

有没有人有任何见解的实施

SystemThreading.Thread.CurrentThread.ManagedThreadId

就像它是否在进行内核往返一样?我特别想知道从多个线程重复调用它是否比读取一次值更好,将其存储在线程本地存储中,然后使用该值,例如

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

我今天要测量这两种变体,但我认为事先听到任何想法(或偏见:))会很有趣。

4

1 回答 1

3

CurrentThread 和 ManagedThreadId 都是内部调用属性,因此值检索由框架本身处理。由于它们是属性,而不是方法,因此可以合理地假设它们可以被快速访问并且没有必要存储它们,除非您将它们置于具有大量迭代的循环中。

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));
        }
    }
}
于 2013-04-15T08:34:07.573 回答