#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..