2011-11-11 161 views
4

在.net 4.0之前,我使用System.Threading.Thread中的命名數據插槽實現了一個解決方案。現在,在.net 4.0中,有了ThreadLocal的概念。 ThreadLocal用法如何與指定的數據插槽進行比較? ThreadLocal值是否被子線程繼承? ThreadLocal是使用命名數據插槽的簡化版本嗎?下面是使用命名數據插槽的一些例子。這可以通過使用ThreadLocal來簡化,它是否會保留與指定數據插槽相同的屬性?什麼時候應該使用ThreadLocal而不是Thread.SetData/Thread.GetData?

public static void SetSliceName(string slice) 
    { 
     System.Threading.Thread.SetData(System.Threading.Thread.GetNamedDataSlot(SliceVariable), slice); 
    } 

    public static string GetSliceName(bool errorIfNotFound) 
    { 
     var slice = System.Threading.Thread.GetData(System.Threading.Thread.GetNamedDataSlot(SliceVariable)) as string; 
     if (errorIfNotFound && string.IsNullOrEmpty(slice)) {throw new ConfigurationErrorsException("Server slice name not configured.");} 
     return slice; 
    } 

回答

2

它看起來像新的ThreadLocal類是Thread.GetData/SetData API的類型安全的等價物。

線程本地存儲永遠不應該由「子線程」繼承,不管機制如何。 TLS由各個線程定義。

請注意[ThreadStatic]屬性自.NET 2.0開始就提供了TLS。

相關問題