2015-06-12 11 views
1

Я создал функцию для добавления одного пользователя за раз в определенную группу (администраторы и т. Д.), Но, похоже, слишком много времени для ответа на GroupPrinciple (5-10 секунд) и group.members .add (5-10 секунд) вызывает и замедляет мое приложение, для ответа требуется почти 15-20 секунд, есть ли более быстрый способ сделать это?GroupPrinciple.FindbyIdentity слишком медленный

private static void Add() 
{ 
var userContext = new PrincipalContext(ContextType.Domain); 
var user = new UserPrincipal(userContext); 
user.SamAccountName = "c1111111"; 
var searcher = new PrincipalSearcher(user); 
user = searcher.FindOne() as UserPrincipal; 

var machineContext = new PrincipalContext(ContextType.Machine, "ABCDEFGHI1", 
    null, ContextOptions.Negotiate, "c123789", "test123"); 
var group = GroupPrincipal.FindByIdentity(machineContext,"Administrators"); 

group.Members.Add(user); 

Console.WriteLine("saving group"); 
group.Save(); 

} 

ответ

0

У меня есть run in to this myself, потому что вы используете одну и ту же группу каждый раз, если вы можете реорганизовать из отыскания группы из добавления пользователя и добавить несколько пользователей одновременно.

private static void Add(IEnumerable<UserPrincipal> users) 
{ 
    var machineContext = new PrincipalContext(ContextType.Machine, "ABCDEFGHI1", 
     null, ContextOptions.Negotiate, "c123789", "test123"); 
    var group = GroupPrincipal.FindByIdentity(machineContext,"Administrators"); 
    foreach(var user in users) 
    { 
     group.Members.Add(user); 
    } 
    Console.WriteLine("saving group"); 
    group.Save(); 
} 

Или другой вариант - найти группу один раз, а затем кешировать ее. Использование Task.Run делает это очень просто, просто запустите задачу в статическом конструкторе, а затем возьмите результат в своей функции добавления. .Result будет блокировать до завершения задачи, после чего будет мгновенно. Важное примечание: GroupPrincipal не является потокобезопасным, поэтому вам нужно будет блокировать изменения в классе.

static YourClassName() 
{ 
    _administratorsGroup = Task.Run(() => 
    { 
     var machineContext = new PrincipalContext(ContextType.Machine, "ABCDEFGHI1", 
      null, ContextOptions.Negotiate, "c123789", "test123"); 
     return GroupPrincipal.FindByIdentity(machineContext,"Administrators"); 
    }); 
} 

private static Task<GroupPrincipal> _administratorsGroup; 

private static void Add(UserPrincipal user) 
{ 
    group = _administratorsGroup.Result; 
    lock(group) 
    { 
     group.Members.Add(user); 

     Console.WriteLine("saving group"); 
     group.Save(); 
    } 
} 

Если это будет в потоке пользовательского интерфейса заменить _administratorsGroup.Result с await _administratorsGroup, он также имеет такое же поведение, ожидания, но не будет блокировать ваш пользовательский интерфейс.

+0

Благодарим за помощь! Я вставил целую функцию функции добавления. Не могли бы вы пересмотреть код и предоставить свои отзывы. – user2229874

+0

У вас действительно есть эти фиксированные значения для 'Add', вы не передаете никаких параметров? –

+0

Я передаю имя пользователя в качестве параметра в функции добавления, но добавляю/получаю только одно имя пользователя от пользователя за раз. user.SamAccountName = userName ("c1111111"); – user2229874