2014-12-03 7 views
0

Я написал довольно простое приложение C#, которое сканирует наш активный каталог для заблокированных учетных записей и возвращает имена пользователей в поле списка (LB1). Вот код для поиска. Это подпадает под событием Button_Click:Индикатор выполнения Winforms с использованием функции PrincipalSearcher

  try 
     { 
      PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "DOMAIN", "OU=OUnAme,DC=DOMAIN,DC=com"); 

      UserPrincipal qbeUser = new UserPrincipal(ctx); 
      qbeUser.Enabled = true; 

      PrincipalSearcher search = new PrincipalSearcher(qbeUser);   

      foreach (UserPrincipal user in search.FindAll()) 
      { 
       if (user.IsAccountLockedOut()) 
       { 
        LB1.Items.Add(user.SamAccountName.ToString()); 
       } 
      } 
     } 

Есть ли способ осуществить прогресс бар, который заполняет для() события FindAll? Хотел бы я просто сначала выполнить функцию count, чтобы определить максимальное значение для индикатора выполнения, а затем добавить дополнение в качестве первого шага цикла foreach?

Спасибо, WES

+2

Не успел дать хороший полный ответ, но вы, вероятно, захотите посмотреть в ['BackgroundWorker'] (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker % 28v = vs.110% 29.aspx), чтобы вы могли выполнять обработку без блокировки потока пользовательского интерфейса. Также имейте в виду [этот вопрос] (http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c), в котором подробно описывается, как обновлять поток пользовательского интерфейса из фоновый поток. – Anthony

ответ

0

использовать этот

UserPrincipal []user_all = search.FindAll(); 
int max = user_all.length; 
progressBar1.Maximum = max; 
progressBar1.Step = 1; 
foreach (UserPrincipal user in user_all) 
{ 
    if (user.IsAccountLockedOut()) 
    { 
     LB1.Items.Add(user.SamAccountName.ToString()); 
    } 
    progressBar1.PerformStep(); 
} 
+2

да и делать это в некоторой теме. –

+0

Единственная проблема, с которой я вижу, заключается в том, что она дважды сканирует AD. В этот момент он делает индикатор прогресса бесполезным, поскольку я, возможно, просто попробовал его для первоначальной цели. – Wes

0

Общая последовательность действий я хотел бы сделать в этой ситуации, так как вы не можете получить обратную связь о ходе работы с FindAll.

  • Сделайте свой бар показать прогресс пустой (прогресс не заполнен)
  • Иметь статус, который говорит: «Сбор счетов» (или что вы хотите)
  • Установить FindAll() результаты локальной переменной и получить свой счет.
  • Настройте индикатор выполнения на счет плюс некоторое произвольное число, чтобы узнать, что вы нашли.
  • Увеличьте прогресс до того числа, которое вы сделали, чтобы показать, что оно завершено.
  • Теперь начните цикл и обновите индикатор выполнения.

Не забудьте сделать это в фоновом потоке, чтобы вы действительно могли работать и обновлять интерфейс одновременно.

Смежные вопросы