Проблема в том, что ваш анонимный делегат-писатель создает замыкание через i
.
То есть, когда ваши потоки записи выполняются, они будут использовать текущее значение из i
вместо значения в то время, когда поток был запущен (7 , 8, 9 ... и т. Д.)
Чтобы исправить это, вам нужно сделать копию переменной внутри вашего цикла for и использовать ее в делегате вашего писателя:
internal void Execute()
{
for (int i = 7; i < 10000; i++)
{
// trimmed for brevity: create a copy of i
int copy = i;
new Thread(new ThreadStart(delegate
{
_lock.EnterWriteLock();
try
{
_dict.Add(copy, copy); // Exception after random number of loops
Console.WriteLine(copy.ToString() + " added");
}
finally
{
_lock.ExitWriteLock();
}
})).Start();
}