gpt4 book ai didi

c# - 为什么我得到这个异常(exception)

转载 作者:太空狗 更新时间:2023-10-30 00:52:49 28 4
gpt4 key购买 nike

我有一个 System.Data.DataSet 和 1 个表。该表有很多列。

Screenshot of the DataSet Designer

在某个事件处理程序中,我在已经存在的数据行中(在设置时)为其中一个字段设置了十进制值。

在极少数情况下,我会遇到 ArgumentOutOfRangeException 异常。

消息:System.ArgumentOutOfRangeException:索引超出范围。必须为非负数且小于集合的大小。

调用堆栈:

   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.DataRow.BeginEditInternal()
at System.Data.DataRow.set_Item(DataColumn column, Object value)
at CPITS.Data.OrdersRow.set_ExecutionPrice(Decimal value)

奇怪的是,这是从框架生成的代码中发生的(当然,我没有为 DataColumn 编写 Setter)。

你能帮我理解并解决这个问题吗?

编辑

下面是我设置值的代码:

void ibclient_OrderStatus(object sender, OrderStatusEventArgs e)
{
Data.OrdersRow drOrders = data.Orders.FindByOrderId(e.OrderId);

if (drOrders != null)
{
drOrders.FilledQuantity = e.Filled;
drOrders.ExecutionPrice = e.AverageFillPrice; //Sporadic Exception when setting a decimal value
}
}

最佳答案

这里是RecordManager.NewRecordBase的反编译代码

internal int NewRecordBase()
{
int num;
if (this.freeRecordList.Count != 0)
{
num = this.freeRecordList[this.freeRecordList.Count - 1];
this.freeRecordList.RemoveAt(this.freeRecordList.Count - 1);
}
else
{
if (this.lastFreeRecord >= this.recordCapacity)
this.GrowRecordCapacity();
num = this.lastFreeRecord;
++this.lastFreeRecord;
}
return num;
}

如您所见,唯一可能出现“索引越界”异常的情况是:

num = this.freeRecordList[this.freeRecordList.Count - 1];

由于 DataTable 不是线程安全的,我们可以很容易地想象这样一种情况:在访问 freeRecordList[..] 之前,但在访问 this 之后,另一个线程删除了一条记录。 freeRecordList.Count.

在这种情况下,freeRecordList.Count 会同时发生变化 => 索引越界异常。

因此,如果我是你,我会尝试找出并发问题(它在极少数情况下发生的事实是另一个论点!)

关于c# - 为什么我得到这个异常(exception),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19661716/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com