2016-10-10 4 views
0

Ich versuche, Sicherheitsgruppen von einem Server Combobox in Hintergrund Worker hinzuzufügen. Aber es dauert Zeit und trotz Hintergrund-Benutzeroberfläche UI reagiert nicht mehr.C# WPF: Artikel hinzufügen, der Zeit nimmt

private void Accounts_Click(object sender, RoutedEventArgs e) 
{ 

if (servername.Text == "") 
    MessageBox.Show("please enter server"); 

else 
{ 
    mycombobox.Items.Clear(); 
    server1 = servername.Text; 
    bgw_account = new BackgroundWorker(); 
    bgw_account.WorkerReportsProgress = true; 
    bgw_account.ProgressChanged += new ProgressChangedEventHandler(bgw_account_ProgressChanged); 


    bgw_account.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_account_RunWorkerCompleted); 
    bgw_account.DoWork += new DoWorkEventHandler(bgw_account_DoWork); 
    bgw_account.RunWorkerAsync(); 
    } 

} 


     private void bgw_account_DoWork(object sender, DoWorkEventArgs e) 
    { 

     ParallelOptions po = new ParallelOptions(); 

     po.MaxDegreeOfParallelism = System.Environment.ProcessorCount; 
     acclist = new List<string>(); 
     using(PrincipalContext pt= new PrincipalContext(ContextType.Machine,server1.ToString())) 
     using (GroupPrincipal ab = new GroupPrincipal(pt)) 
     using (var searcher=new PrincipalSearcher(ab)) 
     using (var results=searcher.FindAll()) 
     { 

     Parallel.ForEach(results,po,(currentsam)=> 
     { 
     acclist.Add(currentsam.SamAccountName.ToString());//timeconsuming task 
     }); 


     } 


    } 

     private void bgw_account_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 

     mycombobox.Dispatcher.Invoke(new Action(() => 
     { 

     mycombobox.Items.Clear(); 
     })); 

      foreach (string p in acclist) 
      { 
      mycombobox.Dispatcher.Invoke(new Action (()=> 
      { 
      mycombobox.Items.Add(p); 
      })); 
      } 


     acclist.Clear(); 
     }  

Gibt es eine Möglichkeit, die Leistung zu verbessern?

+0

Wie viele Ergebnisse erhalten Sie zurück? ie was ist die Zählung der Ergebnisse? – ajg

+0

Rund 30 Artikel –

Antwort

0

Nicht getestet.

Was insPrincipalSearcher.FindAll() tut, erstellt wahrscheinlich eine Sammlung, ohne das AD tatsächlich zu suchen. Der eigentliche AD-Verkehr ist abgeschlossen, wenn Sie die results Schleife durchlaufen.

Versuchen Sie also, die results innerhalb bgw_account_DoWork zu loopen und die resultierenden samAccountNames in eine Liste für den Verbrauch in bgw_account_RunWorkerCompleted aufzunehmen.

+0

Danke für Ihre Hilfe. Es scheint, dass 'insPrincipalSearcher.Findall()' die Sammlung innerhalb von Forloop erstellt. Der Code wurde geändert, um dies zu erhalten. –

+0

Jetzt dauert es etwa zwei Minuten, um Gruppen in 'acclist' innerhalb von' bgw_account' hinzuzufügen, das Hinzufügen von Combobox in 'bgw_account_RunWorkerCompleted' fügt keine Verzögerung hinzu. –

+0

Ich weiß nicht, wie viel Zeit es vor der Änderung dauert. Also 2 Minuten ist besser oder schlechter? Ein wichtiger Punkt ist, dass das Verschieben von Code in "DoWork" die Ladezeit nicht beschleunigt, sondern nur das Problem des Einfrierens der Benutzeroberfläche löst (während der 2-minütigen Benutzeroberfläche reagiert es). Um den Benutzer exp weiter zu verbessern, können Sie die Elemente, die in 'ProgressChanged' geladen wurden, hinzufügen. So erscheint die Benutzeroberfläche reaktionsfähiger. – baldpate