【发布时间】:2014-07-02 03:18:04
【问题描述】:
我正在尝试找出在多线程应用程序中更新 DataGridView 时防止 UI 锁定的最佳方法。
该应用会轮询大约 100 台机器的数据,并每隔几秒用结果更新 DGV。
这很忙,并且锁定了 UI,使任何交互都变得迟缓。在这种情况下更新 UI 最有效的方法是什么?
当前设置是 DGV 使用 TableAdapter 链接到 MySQL 表,并且 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
【问题讨论】:
-
如果您在 UI 线程上进行所有处理,请查看此帖子:stackoverflow.com/questions/1644874/…
-
也许你可以让你的线程将它们的数据写入一些共享的数据结构,然后有一个单独的计时器让 DGV 每秒更新一次该结构中的所有行。目前您每秒更新 DGV 100 次,因此它被锁定也就不足为奇了。
-
@Blorgbeard 感谢您的建议。我尝试了一下,它改善了这种情况,但不幸的是,就用户体验而言,仍有很多不足之处。例如,当滚动 DGV 时,UI 锁定。
标签: .net vb.net multithreading datagridview