我得到"索引超出范围"我在数组列表上使用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.Buffer1..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行
答案 0 :(得分:0)
您在同一张桌子上并行呼叫DataTable.NewRow()
。 DataTable
不是线程安全的,这就是为什么它不起作用。
如果您遇到DataTable
,我认为最好的选择就是根本不使用并行化。
您也可以尝试锁定有问题的操作(调用NewRow()
),但我不确定这是否足以使代码线程安全。