多个Task.Run没有等待/正常运行

时间:2014-12-18 10:49:32

标签: c# task

我尝试使用某些任务优化繁重的流程,但似乎在第一次迭代后它会跳过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);
        }
    }
}

1 个答案:

答案 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++)