ThreadLocal<;T>;-什么是线?(C#)

ThreadLocal<;T>;-什么是线?(C#),c#,multithreading,C#,Multithreading,我正在努力学习C#中的多线程(我只是为了好玩而学习)并且意识到我可能不理解线程是什么!当我运行下面的代码时,我希望得到如下输出 T1: 11 T2: 11 T3: 11 T4: 11 T5: 11 T6: 11 (可能顺序不同) 然而,我得到的是 T1: 11 T2: 11 T3: 12 T5: 12 T6: 13 T4: 11 我假设每个任务(T1到T6)都是一个新线程,因此“local”的每个实例都将初始化为10并递增1。但这看起来肯定不会发生。如果有人能解释发生了什么以及我错误地假设了

我正在努力学习C#中的多线程(我只是为了好玩而学习)并且意识到我可能不理解线程是什么!当我运行下面的代码时,我希望得到如下输出

T1: 11
T2: 11
T3: 11
T4: 11
T5: 11
T6: 11
(可能顺序不同)

然而,我得到的是

T1: 11
T2: 11
T3: 12
T5: 12
T6: 13
T4: 11
我假设每个任务(T1到T6)都是一个新线程,因此“local”的每个实例都将初始化为10并递增1。但这看起来肯定不会发生。如果有人能解释发生了什么以及我错误地假设了什么,我将非常感激。 (我必须承认,我发现很难掌握线程,因为我找不到任何足够基础的东西来开始!)

使用系统;
使用系统线程;
使用System.Threading.Tasks;
命名空间测试线程
{
类TestThreadLocal
{
静态void Main()
{
ThreadLocal local=新的ThreadLocal(()=>
{返回10;
});
任务t1=任务。运行(()=>
{local.Value++;
Console.WriteLine(“T1:+local.Value”);
});
任务t2=任务。运行(()=>
{local.Value++;
Console.WriteLine(“T2:+local.Value”);
});
任务t3=任务。运行(()=>
{local.Value++;
Console.WriteLine(“T3:+local.Value”);
});
任务t4=任务。运行(()=>
{local.Value++;
Console.WriteLine(“T4:+local.Value”);
});
任务t5=任务。运行(()=>
{local.Value++;
Console.WriteLine(“T5:+local.Value”);
});
任务t6=任务。运行(()=>
{local.Value++;
Console.WriteLine(“T6:+local.Value”);
});
任务等待(t1、t2、t3、t4、t5、t6);
local.Dispose();
}
}
}

原因是
任务。Run
使用线程池,这意味着它从已经存在的线程池中获取一些空闲线程,对其进行处理,然后将其返回(用简化的术语)。因此,一个或多个后续的Tas.Run操作完全有可能在同一个线程上运行。最简单的验证方法是打印当前线程id:

Task.Run(() => {
   local.Value++;
   Console.WriteLine("Thread id: {0}, value: {1}", Thread.CurrentThread.ManagedThreadId, local.Value);
}

任务!=线程。任务的一个要点是划分工作单元,而不关心线程的详细信息,因为
Task.Run
使用线程池,如果此线程已成功完成上一个任务,则某些任务将在同一线程上运行。当我读到“tasks!=Threads”时,我会说“aHA!”。这很有道理。谢谢Evk-这很有道理,而且解释得很清楚。这正是我需要知道的。也谢谢你关于添加线程ID的提示,因为这使它更加清晰。
Task.Run(() => {
   local.Value++;
   Console.WriteLine("Thread id: {0}, value: {1}", Thread.CurrentThread.ManagedThreadId, local.Value);
}