【问题标题】:my Gridview still freezes in backgroundworker Dowork while using this.invoke(MethodInvoker)delegate使用 this.invoke(MethodInvoker)delegate 时,我的 Gridview 仍然在 backgroundworker Dowork 中冻结
【发布时间】:2015-08-07 23:53:48
【问题描述】:

我想在检索数据的同时逐步更新我的 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;

        }

这是我的后台GroundWrkr完成

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

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

【问题讨论】:

  • 冻结可能是因为后台工作人员太快了?你能在里面放一个睡眠定时器吗?
  • 我需要睡觉吗?会不会影响性能?
  • 我在调用之前尝试过 Thread.Sleep(1000) 并且没有发生相同的冻结但在某种程度上进程缓慢
  • 为什么不把这条指令“myGrdVw.DataSource = myApp.dtResults”放在backGroundWrkr_ProgressChanged中?
  • 我得到了同样的结果!!

标签: c# gridview delegates backgroundworker desktop-application


【解决方案1】:

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

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);

}

感谢大家的帮助!

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      相关资源
      最近更新 更多