我正試圖解決在多線程應用程序中更新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