2014-12-18 8 views
2

Я пытаюсь оптимизировать тяжелый процесс с некоторыми задачами, но кажется, что после первой итерации он пропускает метод 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); 
     } 
    } 
} 
+0

«после первой итерации он пропускает ProcessQueue», не так ли? Откуда вы знаете? Выполняет ли 'IImportedRow == null' вторую задачу. Если это так, ваш цикл будет работать только один раз. –

+0

Мне кажется, что ваш 'this._CurrentRow + = 50;' должен быть 'this._CurrentRow + = 100;', поскольку вы обрабатываете 100 элементов между двумя задачами. Это может быть не актуально, но, похоже, стоит исправить ... –

+0

@JonSkeet Исправлено, и да, это не имело никакого отношения к проблеме. @BenRobinson Я могу это знать, потому что отладка '_LastRowReached' никогда не является« истиной », но она продолжает цикл –

ответ

1

Проблема заключается в том, что ваша петля является конкретизирующей, если быть конкретным ее условием.

Вы должны либо перебрать range, т.е.

foreach (var i in range) 

или перебирать индекс, т.е.

foreach (var idx = 0; idx < range.Length; idx++) 
{ 
    var i = range[idx]; 

Например предположим, что this._CurrentRow == 100, то ваша версия для цикла будет выглядят так:

for (int i = 100 /* range.First() */; i < 50 /* range.Length */; i++) 
+0

О, это была глупая ошибка, спасибо! –

Смежные вопросы