使用任务时索引超出范围异常
本文关键字:范围 异常 索引 任务 | 更新日期: 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()
),但我不确定这足以使代码线程安全。