2016-10-10 13 views
0

バックグラウンドワーカーでコンボボックスにサーバーのセキュリティグループを追加しようとしています。 しかし、それは時間がかかり、バックグラウンドワーカーUIが応答しなくなったにもかかわらずです。C#WPF:アイテムの追加時間を追加する

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

パフォーマンスを改善する手段はありますか?

+0

戻ってきた結果はいくつですか?すなわち、結果の数は何ですか? – ajg

+0

約30の商品 –

答えて

0

テストされていません。

insPrincipalSearcher.FindAll()は実際にはADを実際に検索せずにコレクションを作成している可能性があります。実際のADトラフィックは、resultsをループするときに実行されます。

resultsbgw_account_DoWorkにループして、結果のsamAccountNamesをbgw_account_RunWorkerCompletedのリストに入れてください。

+0

ご協力ありがとうございます。 'insPrincipalSearcher.Findall()'はforloop内にコレクションを構築しているようです。これを取得するようにコードを変更しました –

+0

今度は、 'bgw_account'内の' acclist'にグループを追加するのに2分ほどかかります。 'bgw_account_RunWorkerCompleted'にコンボボックスを追加すると遅延が追加されません。 –

+0

変更前にどれくらい時間がかかっているのか分かりません。だから2分は良いか悪いですか?注意すべき点の1つは、コードをDoWorkに移動するだけで読み込み時間が短縮されるわけではなく、UIのフリーズの問題を解決するだけです(2分間のUIが応答する間)。ユーザエクスペリエンスをさらに向上させるために、UIにロードされたアイテムを 'ProgressChanged'に追加することができます。したがって、UIはより反応しやすいように見えます。 – baldpate

関連する問題