加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – BackgroundWorker很慢

发布时间:2020-12-16 01:39:50 所属栏目:百科 来源:网络整理
导读:我正在开发一个项目( WPF),我有一个Datagrid从数据库加载超过5000条记录,所以我使用BackgroundWorker建议用户数据正在加载,但它太慢了,我需要等待将近2分钟才能加载来自数据库的数据,相反,如果我不使用BackgroundWorker,我需要等待3秒才能在Datagrid中加载数
我正在开发一个项目( WPF),我有一个Datagrid从数据库加载超过5000条记录,所以我使用BackgroundWorker建议用户数据正在加载,但它太慢了,我需要等待将近2分钟才能加载来自数据库的数据,相反,如果我不使用BackgroundWorker,我需要等待3秒才能在Datagrid中加载数据.

在这里,我写下我用于BackgroundWorker的代码片段:

private void RunWorker()
    {
        worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.WorkerSupportsCancellation = true;
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
        worker.RunWorkerAsync();
    }



    private void worker_DoWork(object sender,DoWorkEventArgs e)
    {
        BackgroundWorker senderWorker = sender as BackgroundWorker;
        dc = new DataClasses1DataContext();
        var query = from c in dc.Contact_DDBB_Xavis
                    select
                        new
                        {
                            c.ContactID,c.Continent,c.Country,c.City,c.PostalCode,c.CompanyName,c.UserCreated,c.DateCreated,c.UserModified,c.DateModified
                        };

        if (query.Count() > 0)
        {

            for (int i = 0; i < query.Count(); i++)
            {

                int progressInPercent = (int)(((decimal)(i + 1) / (decimal)query.Count()) * 100);
                worker.ReportProgress(progressInPercent,i);

                System.Threading.Thread.Sleep(10);
                e.Result = query.ToList();

            }
        }
        if (senderWorker.CancellationPending)
        {
            e.Cancel = true;
        }
    }

    private void worker_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            this.dataGrid.DataContext = e.Result;

            backGround.Visibility = Visibility.Collapsed;
            duracel.Visibility = Visibility.Collapsed;
            txtBackWORK.Visibility = Visibility.Collapsed;

        }
    }


    private void worker_ProgressChanged(object sender,ProgressChangedEventArgs e)
    {
        for (double i = 0.0; i < e.ProgressPercentage; i++)
        {
            duracel.pthFiller.Width = 0;
            double max = 312;
            max = (double)e.ProgressPercentage;

            duracel.pthFiller.Width = e.ProgressPercentage * 3.12;

            duracel.txtStatus.Text = e.ProgressPercentage + " %";
            txtBackWORK.Text = String.Format("Loading " + e.ProgressPercentage + " %");

        }
    }

现在我不知道我的代码中是否有什么问题,所以我问你如何在没有等待很长时间的情况下加快数据库加载的速度.

感谢您的关注.

玩的很开心.

干杯

解决方法

每次调用query.Count()时,都会运行另一个SQL查询.
您应该调用Count()一次,并将其存储在局部变量中.

此外,如果进度实际发生了变化,您应该只调用`ReportProgress. (称它为1000次没有意义)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读