在繁忙的多线程应用程序中更新UI的最佳方法

时间:2014-07-02 03:18:04

标签: .net vb.net multithreading datagridview

我尝试找出在多线程应用中更新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

1 个答案:

答案 0 :(得分:0)

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

了解如何create and terminate threadsTPL