2014-07-02 35 views
2

我正试图解决在多线程应用程序中更新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 
+0

如果你正在做的UI线程上所有的处理,然后看看这个帖子:http://stackoverflow.com/questions/1644874/prevent -ui-from-freezing-without-additional-threads –

+0

也许你可以让自己的线程将自己的数据写入某个共享数据结构,然后为DGV每隔一秒更新一次该结构的所有行。目前,您每秒更新DGV 100次,因此锁定时间并不奇怪。 – Blorgbeard

+0

@Blorgbeard谢谢你的建议。我试了一下,它改善了情况,但不幸的是,就用户体验而言,仍然有很多不足之处。例如,当滚动DGV时,UI锁定。 – doovers

回答

0

手动调度工作提高到一个新的线程或使用TPL(异步/等待)。如果您需要更多帮助,请发布您的代码。

看一看如何create and terminate threadsTPL

+0

所有的工作都是在其他线程上完成的,它只是锁定UI的表适配器更新。我已经在我的问题中发布了一些代码,可以说明发生了什么事情。 – doovers

+0

哦,天哪,我不知道任何VB.Net,但我想我现在明白你的问题。当您的下拉菜单载入数千个结果集时,我遇到了类似的问题。我们用来解决这个问题的唯一途径是将其更改为使用ajax调用,以便其余的UI保持响应。也许有VB.Net经验的人可以进一步帮助你。 –

相关问题