数据表

时间:2016-09-01 09:04:31

标签: vb.net datatable indexoutofrangeexception

我有一个应用程序,DAQ系统以大约1 kHz的频率对数据进行采样,然后写入DataTable。

下面的代码块显示了将数据添加到数据表的部分代码。

    Public Sub AddTimeLoadData(DateTime As DateTime, DataPointNo As Integer, ClampForceN As Double, _
                               TransverseForceN As Double, TransverseDispMm As Double, NumLoadCycles As Integer)

        Try
            _tblTimeLoadData.AddtblTimeLoadDataRow(NumLoadCycles, TransverseDispMm, TransverseForceN, ClampForceN, DataPointNo, DateTime, _TimeLoadTestRow)
            _timRaiseDataAdded.Start()
        Catch ex As Exception
            Throw New Exception("Time/load data could not be added: " & ex.Message, ex)
        End Try
    End Sub

每次调用AddTimeLoadData时都不需要更新GUI,所以我开始使用System.Timers.Timer。在计时器的Elapsed事件中,我引发了TimeLoadDataUpdated事件。

在GUI中,另一个类正在侦听此事件,并更新图表。这在大多数情况下效果很好,但偶尔从数据表中读取时会出现IndexOutOfRangeException。

很明显,这与同步有关,但我还没有确切地知道可能是什么问题。 看看代码,索引'i'真的不能超出范围。 提出的一个想法是,如果for循环在创建的同时到达最后一行,我可能会遇到问题,所以我可以尝试将for循环更新为

For i As Integer = s.Points.Count To sender.tblTimeLoadData.Count - 2

或许还有其他我预见到的东西!?

1 个答案:

答案 0 :(得分:0)

VB保留内存" To" for循环的一部分。

    Dim c As Integer

    c = 3

    ' This will print 0, 1, 2, 3
    For i As Integer = 0 To c
        c = 10
        Console.WriteLine(i)
    Next

您可能需要考虑使用while循环。

    Dim c As Integer

    c = 3

    Dim i As Integer = 0

    ' Will print 0 to 9
    While i < c
        c = 10
        Console.WriteLine(i)

        i += 1
    End While

或者正确地同步所有内容,因为即使在While / For行和Rows(i)行之间,也有可能删除该项目。

此外,如果您的计时器在那里更新UI。您应该考虑从中删除所有业务规则。在对UI执行任何操作之前,已经使用正确的数据点填充了ds。