Добавление строк в элемент управления DataGridView приводит к сбою, но только со второй попытки

#vb.net #multithreading #datagridview

#vb.net #многопоточность #datagridview

Вопрос:

У меня есть DataGridView (dgvNew), который заполняется файлом JSON, который находится с помощью FileSystemWatcher, данные добавляются строка за строкой после чтения. Он отлично работает с первым файлом. Но если я запускаю новый файл, копируя и вставляя тот же файл JSON, он снова добавляет строки строка за строкой, как и ожидалось id, но затем вся форма завершает работу без ошибок.

Я пробовал TRY .. CATCH с циклами WHILE для открытия файлов, которые работают с точки зрения их открытия и добавления строк, я просто не понимаю, почему это происходит сбой. Код продолжает выполняться независимо, даже если форма заморожена? связано ли это с потоком?

     Public Sub subParseJSONs(strFilePath As String, strDesiredField As String)

        Dim json As String
        Dim strMachine As String
        Dim read As New Newtonsoft.Json.Linq.JObject
        Dim booErrorJSNOArrRead As Boolean
        Dim i As Integer
        Dim dgvIndex As Integer
        Dim booOpened As Boolean
        Dim k As Integer, j As Integer

        booOpened = False
        k = 1
        j = 1
        json = Nothing



        While json Is Nothing
            Try
                j = j   1
                If j = 10 Then
                    MessageBox.Show("J integer reached 10")
                    Exit While
                    Exit Try
                End If
                json = Replace(Replace(System.IO.File.ReadAllText(strFilePath), vbLf, ""), vbTab, "")
                read = Newtonsoft.Json.Linq.JObject.Parse(json)

            Catch ex As IOException
                'MessageBox.Show(ex.Message)
                Threading.Thread.Sleep(300)
                'GoTo EndOfSUb
            Catch ex As Exception
                'MessageBox.Show(ex.Message)
                Threading.Thread.Sleep(300)
                'GoTo EndOfSUb
            Finally
                booOpened = True

            End Try


        End While




        booErrorJSNOArrRead = False
        i = 0


        dgvNew.ColumnCount = 6
        dgvNew.Columns(0).Name = "TempID"
        dgvNew.Columns(1).Name = "DriverName"
        dgvNew.Columns(2).Name = "Seat"
        dgvNew.Columns(3).Name = "RaceTime"
        dgvNew.Columns(4).Name = "ResultTime"
        dgvNew.Columns(5).Name = "CarDriven"


        dgvNew.RefreshEdit()
        dgvNew.Refresh()

        Do Until i = read.Item("Result").Count

            If Not read.Item("Result")(i)("DriverName") = "" Then
                Dim milliseconds As Double = Convert.ToDouble(read.Item("Result")(i)("TotalTime"))
                Dim ts As TimeSpan = TimeSpan.FromMilliseconds(milliseconds)

                Dim strMMSSmmm As String = ts.Minutes.ToString amp; ":" amp; ts.Seconds.ToString amp; "." amp; ts.Milliseconds.ToString

                Dim row As String() = New String() {i   1,
                                                read.Item("Result")(i)("DriverName"),
                                                read.Item("Result")(i)("DriverName"),
                                                strMMSSmmm,
                                                DateTime.Now, read.Item("Result")(i)("CarModel")}
                dgvNew.Rows.Add(row)

            End If

            i = i   1

        Loop

        read = Nothing

    End Sub

  

Я ожидаю, что новые строки будут добавлены в нижнюю часть dgvNew, какими они и являются, но затем произойдет сбой?

Комментарии:

1. Как вы вызываете subParseJSONs? Эти ex.Message линии ничего не дали?

2. Я думаю, вам следует 1) Десериализовать JSON надлежащим образом (возможно, используя структуру класса). 2) Добавьте новый JSON в List(Of class) . 3) Объедините новый список с существующим, если он не равен нулю. Установите List(Of class) как DataGridView.DataSource . Если данные необходимо отредактировать, вместо этого используйте BindingList.

3. Вызывается ли этот subParseJSONs() метод из одного из FileSystemWatcher событий? Если это так, то это обычно вызывается в фоновом потоке и вызовет проблемы при попытке доступа к вашему DGV, поскольку он расположен в потоке пользовательского интерфейса. Это можно исправить, указав FSW вызывать свои события в потоке пользовательского интерфейса, установив FileSystemWatcher.SynchronizedObject свойство для любого элемента управления в вашем потоке пользовательского интерфейса, предпочтительно в форме, в которой он выполняется.

4. The code continues to step through regardless even though the form is frozen не выполняйте работу в потоке пользовательского интерфейса . Почему все это Threading.Thread.Sleep(300) ?

5. Можете ли вы попробовать использовать json.net с классами и свойствами? И когда вы определяете все значения, вы просто добавляете их в datagridview .. я мог бы помочь больше, если бы у меня был json..