相关疑难解决方法(0)

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

我发现"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 )
     { …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading attributes

22
推荐指数
2
解决办法
1万
查看次数

ThreadStatic、ThreadLocal、GetData 相对于为线程创建对象实例有什么优势?

有朋友问我ThreadStatic和ThreadLocal哪个更好。检查文档时我告诉他 ThreadLocal 看起来更方便,自 .NET 4.0 起就可用,但我不明白为什么要使用它们中的任何一个而不是为线程创建对象实例。它们的目的是存储“线程本地数据”,因此您可以不那么笨拙地调用方法并避免在某些情况下锁定。当我想要这样的线程本地数据时,我总是创建类似的东西:

    线程处理类
    {
        部分A类;

        公共ThreadHandler(SomeClass A)
        {
            这个.A = A;
        }

        公共无效工人()
        {
        }
    }

如果我只想触发并忘记线程,它将是 new Thread(new ThreadHandler(new SomeClass()).TheWorkerMethod).Start(),如果我想跟踪线程,它可以添加到集合中,如果我想跟踪数据 ThreadHandler可以添加到集合中,如果我想处理两者,我可以为 ThreadHandler 创建 Thread 属性并将 ThreadHandler 放入集合中,我想要线程池它是 QueueUserWorkItem 而不是 new Thread()。如果范围简单,那么它就简短,但如果范围变宽,则可以轻松扩展。

当我尝试用 google 搜索为什么在对象实例上使用 ThreadLocal 时,我所有的搜索最终都会解释 ThreadLocal 如何比 ThreadStatic 强大得多,在我看来,这就像人们在解释他们有一把笨拙的螺丝刀,但现在工具箱里有沉重的猴子- 扳手,钉钉子更方便。虽然工具箱里本来就有一把锤子。

我知道我错过了一些东西,因为如果 ThreadStatic/ThreadLocal 没有优势,它们就不会存在。有人可以指出 ThreadLocal 相对于为线程创建对象实例至少有一个显着优势吗?

UPD:看起来像是这个的双重,我想当我在谷歌搜索“java”关键字时让我失望了。因此,至少有一个优点 - ThreadLocal 更自然地与任务并行库一起使用。

.net c# multithreading

5
推荐指数
1
解决办法
1220
查看次数

C#中的ThreadLocal与局部变量

这个ThreadName和LocalName在下面的代码中有什么区别?他们都是ThreadLocal吗?

// Thread-Local variable that yields a name for a thread
ThreadLocal<string> ThreadName = new ThreadLocal<string>(() =>
{
    return "Thread" + Thread.CurrentThread.ManagedThreadId;
});

// Action that prints out ThreadName for the current thread
Action action = () =>
{
    // If ThreadName.IsValueCreated is true, it means that we are not the 
    // first action to run on this thread. 
    bool repeat = ThreadName.IsValueCreated;
    String LocalName = "Thread" + Thread.CurrentThread.ManagedThreadId;
    System.Diagnostics.Debug.WriteLine("ThreadName = {0} {1} {2}", ThreadName.Value, repeat ? "(repeat)" : "", …
Run Code Online (Sandbox Code Playgroud)

c# multithreading local

5
推荐指数
1
解决办法
1019
查看次数

标签 统计

c# ×3

multithreading ×3

.net ×2

attributes ×1

local ×1