ManagedThreadID不是唯一的吗?

Mah*_*asi 5 c# multithreading dictionary

我的程序为某些任务创建了一些线程.

我的代码是这样的:

Dictionary<int, double> threadStates = new Dictionary<int, double>();
for (int i = 0; i < SubNNs.Count(); i++)
{
    Thread tt = new Thread(StartTrainingSubs);
    threadStates.Add(tt.ManagedThreadId, 0);
    tt.Priority = ThreadPriority.Highest;
    tt.Start(i);
}
Run Code Online (Sandbox Code Playgroud)

但有时,如果SubNNs.Count()变大(10-20),程序会抛出此异常:"已添加具有相同键的项目." 在线threadStates.Add(tt.ManagedThreadId, 0);

为什么我给出这个错误?不是ManagedThreadId唯一的吗?如果是,我该怎么办?

如果不是,也许一个线程完成而另一个线程以相同的方式开始ManagedThreadId?可能吗?如何防止这个问题?

还是有另一个问题?

编辑:用户说ManagedThreadId可以重复使用.所以,因为在代码的后面部分,每个线程需要知道自己有一个唯一的数字,有没有办法在线程中添加类似名称的东西,每个线程都可以得到它唯一的数字?

谢谢你的任何建议!

Ree*_*sey 7

如果不是,可能是一个线程完成而另一个线程以相同的ManagedThreadId开头?可能吗?如何防止这个问题?

是.托管线程ID可以重复使用.它们不是字典状态键的好选择.

您应该考虑使用其他一些唯一值,而不是使用线程ID来跟踪状态.在您的情况下,"i"每个循环是唯一的 - 为什么不将它用作您的密钥?

  • @Mahdi您需要什么线程ID?您可以将信息传递给线程的开头 - 您现在正在执行此操作(`tt.Start(i);`)只需传递您需要的状态即可.如果您需要唯一标识符,请事先将其传递给ParameterizedThreadStart例程. (2认同)