Здесь немного поздно, но если вы только увеличиваете значения в counter [] и outerCounter [], вы можете использовать перегруженную версию Parallel.For ()
Вместо создания локального массива элементов каждого цикла, вы можете создать один локальный для выполнения (и будет работать только один поток за раз)
Например:
int elements=60;
int[] outerCounter=new int[elements];
Parallel.For (1, 2000,
() => new int[elements], // Initialize the local value.
(i0, state, counter) =>
{
int nextPos0=_table[10+i0];
for(i1=i0+1; i1<1990; i1++)
{
//...here are also some additionale calculations done...
int nextPos1=_table[nextPos0+i1];
counter[nextPos1]++;
}
}
counter => // Add the local value
{
for(int i=0; i<elements;i++)
{
Interlocked.Add(ref outerCounter[i], counter[i]);
}
}
);
Я не тестировал приведенный выше код, но в этом суть.
Это значительно сократит количество вызовов, которые вы вызываете Interlocked.Add ()
Для получения дополнительной информации, этот сайт очень хорош:
http://www.albahari.com/threading/part5.aspx