当我使用 ThreadStatic 属性探索线程和任务时,我遇到了一些奇怪的事情。我相信这可能非常特定于线程和任务。考虑下面的代码片段:
[ThreadStatic]
static int range=10;
Action action = () =>
{Console.WriteLine("Thread = {0}, Value = {1}", Thread.CurrentThread.ManagedThreadId, range);
Parallel.Invoke( action, action);
这给出了输出:
Thread = 2, Value = 10
Thread = 3, Value = 0
这绝对没问题,因为 ThreadStatic 变量只能初始化一次,所以第二行显示为 0。
但是,请考虑以下情况:
[ThreadStatic]
static int range=10;
new Thread(() =>
{
Console.WriteLine("Thread = {0}, Value = {1}" Thread.CurrentThread.ManagedThreadId, range);
}).Start();
new Thread(() =>
{
Console.WriteLine("Thread = {0}, Value = {1}" Thread.CurrentThread.ManagedThreadId, range);
}).Start();
这一行给了我输出:
Thread = 6, Value = 0
Thread = 7, Value = 0
我跨越了多少线程,我真的看不到“范围”值被初始化并显示为 10。这里初始化的范围变量在哪里以及为什么在初始化静态变量时线程和任务之间存在区别?
我在这里缺少一些基本的东西吗?提前致谢。