Попробуйте использовать ParallelEnumerable.AsParallel .
data.AsParallel.ForEach(DoWork);
Это автоматически создаст потоки в зависимости от количества процессоров / ядер.Единственная проблема, что он включен в Framework 4.0.Больше информации о PLINQ .(И как прокомментировал andras : для framwork 3.5 он доступен как автономный Reactive Extensions (Rx) )
UPD: как сказал 0xA3, рефакторинг коданастоятельно рекомендуется, чтобы у каждого элемента были свои переменные calc.Я предлагаю вам извлечь логику вычислений в DataItem
Или создать специальный класс, такой как «Калькулятор», который будет выполнять всю работу, чтобы DataItem сохранял только данные, а логика вычислений содержалась бы в классе Calculator.
data.AsParallel.ForEach(x=> new Calculator().DoWork(x));
где класс калькулятора примерно такой
class Calculator
{
// variables here
void DoWork(DataItem item)
{
Step1(item);
Step2(item);
// ...
// StepN(item);
}
}