【问题标题】:Best way to update UI in busy multithreaded app在繁忙的多线程应用程序中更新 UI 的最佳方式
【发布时间】: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


【解决方案1】:

手动将工作分派到新线程或使用 TPL (async/await)。如果您需要进一步的帮助,请发布您的代码。

看看如何create and terminate threadsTPL

【讨论】:

  • 所有工作都在其他线程上完成,只是表适配器更新锁定了 UI。我在我的问题中发布了一些代码,可能会澄清发生了什么。
  • 天哪,我不知道任何 VB.Net,但我想我现在明白了你的问题。当您的下拉菜单加载数千个结果集时,我遇到了类似的问题。我们用来解决这个问题的唯一途径是将它们更改为使用 ajax 调用,以便 UI 的其余部分保持响应。也许有 VB.Net 经验的人可以进一步帮助您。
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 2016-05-23
  • 1970-01-01
  • 2016-08-10
相关资源
最近更新 更多