c# - ManagedThreadID 不是唯一的?

标签 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);
}

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

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

如果不是,也许一个线程结束而另一个线程以相同的 ManagedThreadId 开始?是否可以?如何预防这个问题?

还是有其他问题?

编辑:用户说 ManagedThreadId 可以重复使用。那么,由于在后面的代码中,每个线程都需要知道自己有一个唯一的编号,有没有什么办法可以给线程添加一个名字之类的东西,让每个线程都能获得自己的唯一编号?

感谢您的建议!

最佳答案

If no, maybe a thread finishes and another thread starts with same ManagedThreadId? Is it possible? how to prevent this problem?

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

除了使用线程 ID 来跟踪状态,您应该考虑使用其他一些唯一值。在您的情况下,“i”在每个循环中都是唯一的 - 为什么不将它用作您的 key ?

关于c# - ManagedThreadID 不是唯一的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8596669/

相关文章:

python - 如何使用多处理并行处理 OpenCV 图像?

javascript - 如何正确扩展 ES6 Map

c# - 如何使用 C# 在远程计算机上设置注册表访问规则

c# - 防止在 C# 中重绘控件?

java - 在 Tomcat 服务器启动后运行方法

c++ - 我应该如何在一个函数中锁定 wxMutex 并在另一个函数中解锁它?

python - 按字母顺序对键/值列表进行排序

java - 对象字典,其中 key 是 Java 中的实例字段

c# - Regex.Replace 中的 MatchEvaluator 如何工作?

c# - 按用户名搜索整个 Active Directory 林