【发布时间】:2014-05-17 02:45:11
【问题描述】:
当我在数组列表上使用异步任务时,出现“索引超出范围”异常。我检查了整个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;
}
堆栈跟踪:
在 System.ThrowHelper.ThrowArgumentOutOfRangeException() 在 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.WhereSelectArrayIterator2.MoveNext() 在 System.Linq.Buffer1..ctor(IEnumerable1 来源)在 System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 源)在 PedWebService.GetrowsArrayWithDefaultAndCommonValues(DataTable[]& subcTableArray, DataRow[]& rowsArrayWithDefaultAndCommonValues) in c:\Work\src\PedWebService.cs:2913 行
【问题讨论】:
-
您能否将异常的堆栈跟踪添加到问题中?这应该提供更多的洞察力。
-
感谢瑞恩调查。这是堆栈跟踪。
-
尝试添加一个变量并将其值设置为
subcTableArray.Select(x => x.NewRow())。看起来这可能为空。下次您可以在询问之前尝试使用更简单的示例重现问题。 -
我尝试添加变量并存储 subcTableArray.Select(x => x.NewRow()) 的值。它不为空。它确实有价值,我在调用异步方法之前创建它。
-
您想要完成的总体目标是什么?
标签: c# task-parallel-library task async-await