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