簡體   English   中英

重復調用CurrentThread.ManagedThreadId或將值存儲在線程本地存儲中?

[英]Repeatedly call CurrentThread.ManagedThreadId or store the value in thread local storage?

有沒有人對實施有任何了解

SystemThreading.Thread.CurrentThread.ManagedThreadId

比如它是否正在進行內核往返? 我特別想知道從多個線程重復調用它是否比讀取一次值更好,將它存儲在線程本地存儲中然后再使用該值,就像

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

我今天要測量兩種變體,但認為事先聽到任何想法(或偏見:)會很有趣。

CurrentThread和ManagedThreadId都是內部調用屬性,因此值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));
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM