0

我製作了一個應用程序,它可以同時運行三個背景工作者。它基本上更新了三個datagridviews,它正在做的事情。我的問題是,如果我按下最大化按鈕或任何datagridview程序掛起相當長的時間。我能夠使用水平滾動而不是垂直滾動。我已經嘗試過Backgroundworker_runworkercompleted,並且在線程更新了各自的datagridviews之後,它會根據需要觸發。這是一種正常行爲還是我做錯了任何建議都會有幫助。 P.S:我已經使用step方法運行了整個程序,它們在代碼中沒有無限循環。 在此先感謝 Jhon使用backgroundworkers更新datagridviews後GUI凍結

回答

0

這聽起來像你仍然阻止UI線程莫名其妙。您可能會發布一些代碼片段。另外,您的流程的CPU利用率是多少?如果CPU使用率很高,您可能會以某種方式匱乏UI線程。

0

好的我找到了解決問題的方法,同時逐步消除了感知故障點,我在backgroundworker.dowork事件之外調用了datagridview,並解決了問題。 故事的道德「不要從後臺線程更新數據網格視圖」特別是當你不知道你在做什麼錯誤:)。我希望它能在未來幫助別人。

+0

能否請您給我們,爲什麼我們不能從更新的backgroundworker.Dowork DataGridView中原因是什麼? 我也面臨同樣的問題,所以我將datagridview滾動條設置爲none,當datagridview完全更新時,我再次在backgroundworker.runworkercompleted事件中將滾動條設置爲兩者。 – 2014-07-16 11:40:46

2

當您調用Backgroundworker1.RunWorkerAsync()暫時禁用您的datagridview滾動條時,請放置此行代碼。

DataGridView1.ScrollBars = ScrollBars.None 

現在加入這行代碼在BackgroundWorker1_RunWorkerCompleted事件重新啓用您的datagridview滾動條。

DataGridView1.ScrollBars = ScrollBars.Both 

這絕不會使您的應用程序無法響應。

0

您必須確保您正在從UI線程更新datagridviews。

0

我有同樣的問題。當我的dataGridViews從UI線程更新時,他們工作得很好。當我試圖從backgroundWorker向它們添加一系列行時,它們變得沒有響應。

要解決這個問題,我將行添加到了dataTable中。當我啓動backgroundWorker時,我將dataGridView的.datasource屬性設置爲空。當工作人員完成時,我再次將其設置回dataTable。這既強制dataGridView自行更新,也切斷工作線程中發生的事件與UI中正在顯示的內容之間的同步連接,這似乎減輕了worker完成時的無響應。

使用範例:

Private Sub button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1.Click 
    If bgWorker1.IsBusy <> True Then 
     dataGridView1.DataSource = Nothing 

     bgWorker1.RunWorkerAsync() 
    End If 
End Sub 

Private Sub bgWorker_DoWork(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bgWorker1.DoWork 
    dataTable1.Rows.Add("data") 
End Sub 

Private Sub bgWorker_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As RunWorkerCompletedEventArgs) Handles bgWorker1.RunWorkerCompleted 
    dataGridView1.DataSource = dataTable1 
    dataGridView1.Refresh() 
End Sub