C# ManagedThreadID不是唯一的?
我的程序为一些任务创建一些线程 我的代码如下:C# ManagedThreadID不是唯一的?,c#,multithreading,dictionary,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
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);
}
Dictionary threadStates=new Dictionary();
对于(int i=0;i
但有时,如果SubNNs.Count()
变大(10-20),程序会抛出此异常:“已经添加了具有相同键的项。”代码>
为什么我会给出这个错误?ManagedThreadId
不是唯一的吗?
如果是,我该怎么办
如果否,则可能一个线程结束,另一个线程开始时使用相同的ManagedThreadId
?可能吗?如何预防这个问题
还是有另一个问题
EDIT:用户说ManagedThreadId可以重用。因此,在代码的后面部分,每个线程都需要知道自己的唯一编号,有没有办法向线程添加一个名称之类的东西,使每个线程都可以获得其唯一编号?
谢谢你的建议
如果否,可能一个线程完成,另一个线程使用相同的ManagedThreadId启动?可能吗?如何预防这个问题
对。托管线程ID可以重用。它们不是字典状态键的好选择
<>而不是使用线程ID来跟踪状态,应该考虑使用其他的唯一值。在您的情况下,“i”在每个循环中都是唯一的-为什么不将其用作密钥?是的,线程ID会被回收。谢谢。“我”是独一无二的,没错。但在代码的另一部分中,每个线程都需要知道自己,每个线程都知道自己的ManagedThreadId,但不知道“i”。我可以为每个线程设置一个类似于名称的名称吗?那么,每个线程都可以识别自己?@Mahdi你需要线程ID做什么?您可以将信息传递给线程的start,您现在正在这样做(
tt.start(i);
)只需传递所需的状态即可。如果您需要一个唯一的标识符,请先将其传递给ParameterizedThreadStart例程。每个线程调用一个类中的另一个函数,每个类的事件都应该有一个唯一的编号来标识自己。所以,似乎我应该在该类中添加一个ID变量,并用“I”填充它。因此,每个线程都可以识别自己。对吗?我以前在哈希表中使用ManagedThreadId作为键查找。但是,在调用.Add()之前,请确保调用了.Exists(),如果条目已经存在,请重用该条目。这样,您就不会试图添加一个被重用的线程id。