Я пытаюсь оптимизировать тяжелый процесс с некоторыми задачами, но кажется, что после первой итерации он пропускает метод ProcessQueue
.Несколько Task.Run не ждет/работает должным образом
private void ImportSheet(Excel.Worksheet Data)
{
this._ImportedSlurry = new ConcurrentQueue<AnalizedDataDTO>();
this._LastRowReached = false;
this._CurrentRow = this._FirstRow;
while(!this._LastRowReached)
{
AnalizedDataDTO ImportedRow = this.ValidateRow(Data, _CurrentRow);
Task task1 = Task.Run(() => ProcessQueue(Enumerable.Range(this._CurrentRow, 50).ToArray(),Data));
Task task2 = Task.Run(() => ProcessQueue(Enumerable.Range(this._CurrentRow+50, 50).ToArray(),Data));
Task.WaitAll(task1, task2);
this._CurrentRow += 100;
}
}
private void ProcessQueue(int[] range, Excel.Worksheet Data)
{
for (int i = range.First(); i < range.Length; i++)
{
AnalizedDataDTO ImportedRow = this.ValidateRow(Data, i);
if (ImportedRow == null)
{
this._LastRowReached = true;
break;
}
else
{
this._ImportedSlurry.Enqueue(ImportedRow);
}
}
}
«после первой итерации он пропускает ProcessQueue», не так ли? Откуда вы знаете? Выполняет ли 'IImportedRow == null' вторую задачу. Если это так, ваш цикл будет работать только один раз. –
Мне кажется, что ваш 'this._CurrentRow + = 50;' должен быть 'this._CurrentRow + = 100;', поскольку вы обрабатываете 100 элементов между двумя задачами. Это может быть не актуально, но, похоже, стоит исправить ... –
@JonSkeet Исправлено, и да, это не имело никакого отношения к проблеме. @BenRobinson Я могу это знать, потому что отладка '_LastRowReached' никогда не является« истиной », но она продолжает цикл –