C# C中的ThreadLocal与局部变量#

C# C中的ThreadLocal与局部变量#,c#,multithreading,local,C#,Multithreading,Local,在下面的代码中,此ThreadName和LocalName之间有什么区别?他们都是本地人吗 // Thread-Local variable that yields a name for a thread ThreadLocal<string> ThreadName = new ThreadLocal<string>(() => { return "Thread" + Thread.CurrentThread.ManagedThreadId; }); //

在下面的代码中,此ThreadName和LocalName之间有什么区别?他们都是本地人吗

// 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)" : "", LocalName);
};

// Launch eight of them.  On 4 cores or less, you should see some repeat ThreadNames
Parallel.Invoke(action, action, action, action, action, action, action, action);

// Dispose when you are done
ThreadName.Dispose();
//生成线程名称的线程局部变量
ThreadLocal ThreadName=新的ThreadLocal(()=>
{
返回“Thread”+Thread.CurrentThread.ManagedThreadId;
});
//打印当前线程的ThreadName的操作
动作动作=()=>
{
//如果ThreadName.IsValueCreated为true,则表示我们不是
//在此线程上运行的第一个操作。
bool repeat=ThreadName.IsValueCreated;
字符串LocalName=“Thread”+Thread.CurrentThread.ManagedThreadId;
System.Diagnostics.Debug.WriteLine(“ThreadName={0}{1}{2}”,ThreadName.Value,repeat?”(repeat)”:“”,LocalName);
};
//发射其中八枚。在4个内核或更少的内核上,您应该会看到一些重复的线程名称
并行调用(动作,动作,动作,动作,动作,动作,动作,动作,动作);
//完成后处理
ThreadName.Dispose();

有一个线程池。因此,如果一个线程继续执行第二个操作,您将得到“repeat”。
LocalName是一个局部变量。

LocalName
不是线程局部变量。它的范围是执行周围的lambda。每次lambda运行时(并发运行是独立的),您都会得到一个新值。使用
ThreadLocal
可以获得每个线程的新值。重复调用
ThreadName.Value
仅会在同一个线程上提供一个值


在本例中,这两个线程是等效的,因为
Thread.ManagedThreadId
也是线程本地的。请尝试
Guid.NewGuid()

您是否阅读了
ThreadLocal
的文档?
字符串LocalName
非常ThreadLocal。“只要它没有被一只羔羊包围就行了。”“是的,这就是我提出这个问题的原因。这个例子是从@JonSkeet的示例代码修改而来的-你有吗?我发现的MSDN页面只有“提供线程本地数据存储”。(还有成员规范和一个示例)。@HenkHolterman:Ick,这真的不是很好。尽管如此,最好是这样说:“我试着阅读文档(这里),但我不理解X”……这些值是相等的,但它们并不相等。线程池并行地重用ThreadName。调用。@norekhov不知道你在说什么。在这里,
ThreadName
总是给出与
LocalName
同样的值。