我尝试使用某些任务优化繁重的流程,但似乎在第一次迭代后它会跳过ProcessQueue
方法运行。
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 :(得分:1)
问题是你的for循环,具体是它的if条件。
你应该迭代range
,即
foreach (var i in range)
或迭代索引,即
foreach (var idx = 0; idx < range.Length; idx++)
{
var i = range[idx];
例如,假设this._CurrentRow == 100
,那么for循环的版本将如下所示:
for (int i = 100 /* range.First() */; i < 50 /* range.Length */; i++)