使用任务时索引超出范围异常

时间:2014-05-16 16:02:20

标签: c# task-parallel-library task async-await

我得到"索引超出范围"我在数组列表上使用Async任务时出现异常。我检查了遍历stackoverflow并尝试了不同的方法,但没有一个工作。也许我错过了什么......有人可以建议。

        Task[] dataTasks = (from eachRow in ppcRowsCollection.Rows
                            select CreateDataRows(eachRow, subcTableArray, rowsArrayWithDefaultAndCommonValues)).ToArray();

private async Task<DataRow[]> CreateDataRows(PpcRow givenPpcRow, DataTable[] subcTableArray, DataRow[] rowsArrayWithDefaultAndCommonValues)
{
    return await Task.Run(() =>
    {
        DataTable[] subcTableArrayLocal = subcTableArray;
        DataRow[] defaultRowsArray = GetrowsArrayWithDefaultAndCommonValues(ref subcTableArrayLocal, ref rowsArrayWithDefaultAndCommonValues);
        SetOtherThanCommonColumnValues(ref defaultRowsArray, givenPpcRow);
        return defaultRowsArray;
    }
    ).ConfigureAwait(false);
}

private DataRow[] GetrowsArrayWithDefaultAndCommonValues(ref DataTable[] subcTableArray, ref DataRow[] rowsArrayWithDefaultAndCommonValues)
{
    DataRow[] defaultRowsArray = subcTableArray.Select(x => x.NewRow()).ToArray(); //This is where I am getting EXCEPTION

    DataRow[] defaultRowsArrayCopy = defaultRowsArray;

    foreach (DataRow row in defaultRowsArrayCopy)
    {
        row.ItemArray = rowsArrayWithDefaultAndCommonValues
                            .Where(x => x.Table.TableName == row.Table.TableName)
                            .First()
                            .ItemArray;
    }
    return defaultRowsArrayCopy;
}

堆栈追踪:

  

at System.ThrowHelper.ThrowArgumentOutOfRangeException()at   System.Collections.Generic.List 1.get_Item(Int32 index) at System.Data.RecordManager.NewRecordBase() at System.Data.DataTable.NewRecord(Int32 sourceRecord) at System.Data.DataTable.NewRow(Int32 record) at System.Data.DataTable.NewRow() at PedWebService.<GetrowsArrayWithDefaultAndCommonValues>b__21(DataTable x) in c:\Work\src\PedWebService.cs:line 2913 at System.Linq.Enumerable.WhereSelectArrayIterator 2.MoveNext()at   System.Linq.Buffer 1..ctor(IEnumerable 1来源)at   System.Linq.Enumerable.ToArray [TSource](IEnumerable`1 source)at at   PedWebService.GetrowsArrayWithDefaultAndCommonValues(数据表[]&安培;   subcTableArray,DataRow []&amp; rowsArrayWithDefaultAndCommonValues)in   c:\ Work \ src \ PedWebService.cs:第2913行

1 个答案:

答案 0 :(得分:0)

您在同一张桌子上并行呼叫DataTable.NewRow()DataTable不是线程安全的,这就是为什么它不起作用。

如果您遇到DataTable,我认为最好的选择就是根本不使用并行化。

您也可以尝试锁定有问题的操作(调用NewRow()),但我不确定这是否足以使代码线程安全。