ManagedThreadID не является уникальным? - PullRequest
5 голосов
/ 22 декабря 2011

Моя программа создает несколько потоков для некоторых задач.

Мой код такой:

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 можно использовать повторно. Итак, поскольку в последующих частях кода каждый поток должен знать себя с уникальным номером, есть ли способ добавить что-то вроде имени в поток, чтобы каждый поток мог получить свой уникальный номер?

Спасибо за любые советы!

1 Ответ

7 голосов
/ 22 декабря 2011

Если нет, возможно, поток завершается, а другой поток запускается с тем же ManagedThreadId? Является ли это возможным? как предотвратить эту проблему?

Да. Управляемые идентификаторы потоков можно использовать повторно. Они не являются хорошим выбором для ключа состояния словаря.

Вместо того, чтобы использовать идентификатор потока для отслеживания состояния, вам следует рассмотреть возможность использования какого-то другого уникального значения. В вашем случае «i» уникально для цикла - почему бы не использовать его в качестве ключа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...