我正试图解决在多线程应用程序中更新DataGridView
时阻止我的用户界面锁定的最佳方法。在繁忙的多线程应用程序中更新UI的最佳方式
该应用程序正在轮询~100台机器的数据并每隔几秒更新DGV的结果。
这是非常繁忙的,并锁定了UI,使任何交互缓慢。在这种情况下更新UI的最有效方式是什么?
当前的设置是,DGV通过TableAdapter
和TA中的UI委托子更新行链接到MySQL表。
主题产卵子:
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
如果你正在做的UI线程上所有的处理,然后看看这个帖子:http://stackoverflow.com/questions/1644874/prevent -ui-from-freezing-without-additional-threads –
也许你可以让自己的线程将自己的数据写入某个共享数据结构,然后为DGV每隔一秒更新一次该结构的所有行。目前,您每秒更新DGV 100次,因此锁定时间并不奇怪。 – Blorgbeard
@Blorgbeard谢谢你的建议。我试了一下,它改善了情况,但不幸的是,就用户体验而言,仍然有很多不足之处。例如,当滚动DGV时,UI锁定。 – doovers