2016-10-10 13 views
0

Я пытаюсь добавить группы безопасности с сервера в combobox в фоновом работнике. Но это занимает время и, несмотря на то, что пользовательский интерфейс рабочего стола становится невосприимчивым.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() do, вероятно, создает коллекцию без фактического поиска AD. Фактический трафик AD выполняется, когда вы зацикливаете results.

Поэтому, пожалуйста, попробуйте обвести results внутри bgw_account_DoWork и поместите полученные имена samAccountNames в список для потребления в bgw_account_RunWorkerCompleted.

+0

Спасибо за помощь. Кажется 'insPrincipalSearcher.Findall()' строит коллекцию в forloop. Изменен код, чтобы получить это внутри. –

+0

Теперь для добавления групп в 'acclist' внутри' bgw_account' требуется около 2 минут, добавление combobox в 'bgw_account_RunWorkerCompleted' не добавляет задержки. –

+0

Я не знаю, сколько времени потребуется перед изменением. Так лучше или хуже 2 минуты? Обратите внимание, что перемещение кода в DoWork не ускоряет время загрузки, а просто решает проблему замораживания UI (во время 2-минутного пользовательского интерфейса реагирует). Чтобы улучшить пользовательский интерфейс, вы можете добавить любые элементы, загруженные в интерфейс пользователя в 'ProgressChanged'. Таким образом, пользовательский интерфейс выглядит более отзывчивым. – baldpate