C#是否具有"ThreadLocal"模拟(对于数据成员)到"ThreadStatic"属性?

Cat*_*kul 22 .net c# multithreading attributes

我发现"ThreadStatic"属性最近非常有用,但现在我想要一个"ThreadLocal"类型属性,它允许我在每个线程的基础上拥有非静态数据成员.

现在我知道这会产生一些非平凡的影响,但是:

C#/ .net中是否已经内置了这样的东西? 或者因为到目前为止它的答案是否定的(对于.net <4.0),是否有一个常用的实现?

我可以想出一种合理的方式来实现它,但只会使用已经存在的东西(如果有的话).

稻草人将实现什么我要找的,如果它已经不存在例子:

class Foo
{
    [ThreadStatic] 
    static Dictionary<Object,int> threadLocalValues = new Dictionary<Object,int>();
    int defaultValue = 0;

    int ThreadLocalMember
    {
         get 
         { 
              int value = defaultValue;
              if( ! threadLocalValues.TryGetValue(this, out value) )
              {
                 threadLocalValues[this] = value;
              }
              return value; 
         }
         set { threadLocalValues[this] = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

请原谅任何C#无知.我是一名C++开发人员,最近才开始涉及C#和.net的更有趣的功能

我只限于.net 3.0和3.5(项目已经/将很快转移到3.5).

具体的用例是特定于线程的回调列表(使用虚构的[ThreadLocal]属性) a la:

class NonSingletonSharedThing
{
     [ThreadLocal] List<Callback> callbacks;

     public void ThreadLocalRegisterCallback( Callback somecallback )
     {    
         callbacks.Add(somecallback);    
     }

     public void ThreadLocalDoCallbacks();
     {    
         foreach( var callback in callbacks )  
            callback.invoke();  
     }
}
Run Code Online (Sandbox Code Playgroud)

Tra*_*kel 22

输入.NET 4.0!

如果你被困在3.5(或更早),你应该看一些功能,比如AllocateDataSlot应该做你想要的.

  • 你总是可以使用Reflector对.NET4中的ThreadLocal <T>实现进行反向工程,将它包含在你的项目中,当你最终转移到.NET4时,只需删除你的反向工程实现(其他一切都将保持不变).从.NET2迁移到.NET 3.5时,我使用TimeZoneInfo成功使用了这种技术. (9认同)

Han*_*ant 5

你应该考虑两次.您实际上是在创建内存泄漏. 线程创建的每个对象都保持引用状态,不能进行垃圾回收.直到线程结束.