我尝试找出在多线程应用中更新DataGridView
时阻止我的UI锁定的最佳方法。
该应用程序正在轮询~100台机器上的数据并每隔几秒更新一次DGV结果。
这非常繁忙,并且正在锁定UI,使得任何交互都很迟钝。在这种情况下更新UI的最有效方法是什么?
当前设置是DGV链接到MySQL表,其中TableAdapter
和UI委托子更新行在TA中。
线程产生子:
Private Sub PollEDMs()
For i As Integer = 0 To Me.DataGrid.Rows.Count - 1
Dim edm As New EDM(Me.DataGrid.Rows(i).Cells("IP").Value)
Try
Dim thPoll As New Thread(AddressOf edm.CollectData)
thPoll.Name = "thread" & i
thPoll.IsBackground = True
thPoll.Priority = ThreadPriority.BelowNormal
thPoll.Start()
Interlocked.Increment(ThrCount)
Me.ToolStripThreadStatusLabel1.Text = "Active Threads: " & ThrCount
Catch ex As Exception
logger.Log(LogLevel.Error, edm.IP & " => " & ex.Message)
End Try
Next
End Sub
调用更新子(从另一个线程上运行的EDM类调用)
Public Sub EDMEthernetUpdate(ByVal EDM As EDMEthernet)
Try
SyncLock threadLock
Me.EDMTableAdapter.UpdateByIP(EDM.Ping, EDM.Status.Message,
EDM.Timer.ElapsedMilliseconds, EDM.IP)
End SyncLock
logger.Log(LogLevel.Info, EDM.IP & " => Updated")
Catch ex As Exception
logger.Log(LogLevel.Error, EDM.IP & " => " & ex.Message)
End Try
End Sub
答案 0 :(得分:0)
手动将工作分派到新线程或使用TPL(async / await)。如果您需要进一步的帮助,请发布您的代码。