在使用this.invoke(MethodInvoker)委托时,我的Gridview仍然在后台工作者Dowork中冻结

时间:2015-08-07 23:53:48

标签: c# gridview delegates backgroundworker desktop-application

我想在检索数据时逐步更新我的gridview

我有一个背景工作者如下工作功能

    private void backGroundWrkr_DoWork(object sender, DoWorkEventArgs e)
    {
        DataTable dtInstant = new DataTable();

        for (int i = 0; i < allFiles.Count; i++)
        {
            if (backGroundWrkr.CancellationPending)
            {
                e.Cancel = true;
                return;
            }

               myApp.processFile(allFiles[i]);


              this.Invoke((MethodInvoker)delegate
              {
               myGrdVw.DataSource = myApp.dtResults;
              });


            backGroundWrkr.ReportProgress(100 * (i + 1) / allFiles.Count);
        }
        backGroundWrkr.ReportProgress(100);

    }

这是我的报告进度功能

 private void backGroundWrkr_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar.Value = e.ProgressPercentage;

        }

这是我的backGroundWrkr完成

private void backGroundWrkr_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            progressBar.Visible = false;
            allFiles.Clear();
        }

我也尝试过BeginInvoke而不是Invoke,我的gridview仍然会冻结! 我处理文件的逻辑没有问题,因为如果我在workercomplete中放入datagridview绑定它会成功绑定

2 个答案:

答案 0 :(得分:1)

经过2天的搜索和不成功的试验,我已经解决了如下问题 虽然绑定它似乎backgroundworker在数据表中工作,所以我绑定结果数据表的副本,它解决了我的问题

private void backGroundWrkr_DoWork(object sender, DoWorkEventArgs e)
{
    DataTable dtInstant = new DataTable();

    for (int i = 0; i < allFiles.Count; i++)
    {
        if (backGroundWrkr.CancellationPending)
        {
            e.Cancel = true;
            return;
        }

           myApp.processFile(allFiles[i]);


          this.Invoke((MethodInvoker)delegate
          {
           myGrdVw.DataSource = myApp.dtResults.copy();
          });


        backGroundWrkr.ReportProgress(100 * (i + 1) / allFiles.Count);
    }
    backGroundWrkr.ReportProgress(100);

}

感谢大家的帮助!

答案 1 :(得分:0)

尝试仅绑定数据源一次(即在调用DoWork之前)并在backGroundWrkr_ProgressChanged中执行myGrdVw.Invalidate()。