BackgroundWorker медленный - PullRequest
       2

BackgroundWorker медленный

3 голосов
/ 17 декабря 2010

Я занимаюсь разработкой проекта (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 + " %");

        }
    }

Теперь я не знаю, есть ли что-то не так в моем коде, поэтому я прошу вас несколько советов, как быстрее загружать данные из базы данных без ожидания так долго.

Спасибо за ваше внимание.

Хорошо провести время.

Приветствия

Ответы [ 3 ]

3 голосов
/ 17 декабря 2010

Каждый раз, когда вы звоните query.Count(), вы запускаете еще один SQL-запрос.
Вы должны вызвать Count() один раз и сохранить его в локальной переменной.

Кроме того, вы должны вызывать `ReportProgress, только если прогресс действительно изменился. (Нет смысла называть это 1000 раз)

2 голосов
/ 17 декабря 2010

Избавьтесь от всего блока индикатора прогресса, как он существует.Вы перебираете каждую отдельную запись, приостанавливаете поток, повторно вызываете запрос и присваиваете ему e.Result и, как правило, получаете дополнительные 5000 раз после того, как ваши данные уже загружены. Это бесполезно.

Если данные загружаются в течение нескольких секунд, покажите индикатор прогресса в потоке пользовательского интерфейса, и все будут счастливы.

2 голосов
/ 17 декабря 2010

Умм ... вы звоните System.Threading.Thread.Sleep() в своем коде, в цикле, который, кажется, вызывает запрос несколько раз.

Ваш код обновления также, кажется, излишне зацикливается от 0 дотекущий процент ... не уверен почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...