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

本文关键字:范围 异常 索引 任务 | 更新日期: 2023-09-27 18:03:47

当我在数组列表上使用异步任务时,我正在获得"索引超出范围"异常。我检查了所有的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() atSystem.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 . movenext (系统。linq .缓冲区1..ctor(IEnumerable 1源)在System.Linq.Enumerable。ToArray[TSource](IEnumerable ' 1源PedWebService.GetrowsArrayWithDefaultAndCommonValues (DataTable [],subcTableArray,我们[],rowsArrayWithDefaultAndCommonValues)c: ' ' src ' PedWebService.cs: 2913行

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

你在同一个表上并行调用DataTable.NewRow()DataTable不是线程安全的,这就是为什么它不工作。

如果你坚持使用DataTable,我认为最好的选择是根本不使用并行化。

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