重复调用CurrentThread.ManagedThreadId或将值存储在线程本地存储中

本文关键字:存储 线程 调用 CurrentThread ManagedThreadId | 更新日期: 2023-09-27 18:09:06

有人对

的实现有什么见解吗?
SystemThreading.Thread.CurrentThread.ManagedThreadId

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

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

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

重复调用CurrentThread.ManagedThreadId或将值存储在线程本地存储中

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));
        }
    }
}