2010-12-17 19 views
3

Ich entwickle ein Projekt (WPF) und ich habe ein Datagrid die mehr als 5000 Datensätze aus der Datenbank laden, so habe ich einen BackgroundWorker um den Benutzer die Daten zu laden, aber es ist so langsam, ich muss warten fast 2 Minuten, um die Daten von der Datenbank zu laden, wenn ich nicht den BackgroundWorker verwende, muss ich nur 3 Sekunden warten, um die Daten im Datagrid zu laden.BackgroundWorker langsam

Hier schreibe ich den Code-Schnipsel nach unten, die ich für den Background verwenden:

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 + " %"); 

     } 
    } 

jetzt weiß ich nicht, wenn es etwas falsch in meinem Code ist so frage ich Ihnen einige Ratschläge, wie schneller lädt die Daten aus der Datenbank ohne Wartezeit so lange Zeit.

Vielen Dank für Ihre Aufmerksamkeit.

Viel Spaß.

Prost

+2

Ehrlich gesagt, wenn ich Probleme mit langsamem Code hatte, würde ich als Erstes die 'Sleep()' Aufrufe herausnehmen. –

Antwort

3

Jedes Mal, wenn Sie query.Count() nennen, laufen Sie eine andere SQL-Abfrage.
Sie sollten Count()einmal aufrufen und in einer lokalen Variablen speichern.

Sie sollten `ReportProgress auch nur aufrufen, wenn sich der Fortschritt tatsächlich geändert hat. (Es hat keinen Sinn, es 1.000 Mal aufzurufen)

2

Umm ... Sie rufen System.Threading.Thread.Sleep() in Ihrem Code, in einer Schleife, die die Abfrage mehrere Male aufrufen scheint.

Ihr Update-Code scheint auch unnötigerweise von 0 bis zum aktuellen Prozentsatz zu durchlaufen ... nicht sicher warum?

2

Entfernen Sie den gesamten Fortschrittsanzeigerblock, so wie er existiert. Sie durchlaufen jeden einzelnen Datensatz, pausieren Ihren Thread, rufen die Abfrage erneut an und weisen sie e.Result zu und verursachen nach dem Laden Ihrer Daten im Allgemeinen 5000 Mal einen Overhead von . Das ist nutzlos.

Wenn die Daten innerhalb von Sekunden geladen werden, zeigen Sie eine Laufschrift-Fortschrittsleiste auf dem UI-Thread an, und alle werden zufrieden sein.