Помимо того, что у вас есть недопустимый код (symbolList.IndexOf(i)
, вероятно, должно быть symbolList[i]
), проблема, с которой вы сталкиваетесь, заключается в том, что вы не захватываете переменную цикла перед вызовом лямбды.
Вот простое исправление:
List<string> symbolList = new List<string>() { "AAPL", "QQQ", "FB", "MSFT", "IBM" };
Task[] taskArray = new Task[symbolList.Count];
for (int i = 0; i < taskArray.Length; i++)
{
string symbol = symbolList[i];
taskArray[i] = Task.Factory.StartNew(() =>
{
criteriaEvalution.Evaluate(finalArray, false, new List<parseObj>(), ref builder, symbol);
});
}
Task.WaitAll(taskArray);
Обратите внимание на строку string symbol = symbolList[i];
перед запуском задачи.
Если вы не сделаете этого, цикл завершится до запуска задач, а затем i
будет равен taskArray.Length
, и, следовательно, вы получите ошибку «Индекс был вне диапазона».
Еще одно, что я хотел бы предложить, это то, что вы должны использовать Microsoft Reactive Framework (он же Rx) - NuGet System.Reactive
и добавить using System.Reactive.Linq;
- тогда вы можете сделать это:
List<string> symbolList = new List<string>() { "AAPL", "QQQ", "FB", "MSFT", "IBM" };
var query =
from symbol in symbolList.ToObservable()
from e in Observable.Start(() =>
criteriaEvalution.Evaluate(finalArray, false, new List<parseObj>(), ref builder, symbol))
select e;
query.ToArray().Wait();
Гораздо проще и чище, чем задачи. Тогда вы также можете использовать операторы LINQ для результатов.