ManagedThreadID不是唯一的

本文关键字:唯一 ManagedThreadID | 更新日期: 2023-09-27 18:18:37

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

我的代码是这样的:
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);
}

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

为什么我给出这个错误?难道ManagedThreadId不是独一无二的吗?如果有,我该怎么办?

,如果没有,也许一个线程结束,另一个线程开始相同的ManagedThreadId ?这可能吗?如何预防这个问题呢?

还是有别的问题?

编辑:用户说ManagedThreadId可以重用。那么,既然在代码的后面部分,每个线程都需要知道自己有一个唯一的编号,有没有办法给线程添加一个名称之类的东西,让每个线程都能得到它唯一的编号呢?

谢谢你的建议!

ManagedThreadID不是唯一的

如果没有,也许一个线程结束,另一个线程开始与相同的ManagedThreadId?这可能吗?如何预防这个问题呢?

是的。托管线程id可以被重用。它们不是字典状态键的好选择。

与其使用线程ID来跟踪状态,不如考虑使用其他的唯一值。在您的例子中,"i"在每个循环中是唯一的-为什么不将它用作键呢?