2014-07-02 106 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經驗的人可以進一步幫助你。 –

相關問題