Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ManagedThreadID不是唯一的?_C#_Multithreading_Dictionary - Fatal编程技术网

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。