2015-06-12 43 views
1

我已經創建了一個功能來一次添加一個用戶到特定的組(管理員等),但它似乎需要很長時間才能響應GroupPrinciple(5-10秒)和group.members .add(5-10秒)調用並放慢我的應用程序,它需要將近15-20秒的響應時間,有沒有更快的方法來做到這一點?GroupPrinciple.Findby身份太慢

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

如果這將是在UI線程更換_administratorsGroup.Resultawait _administratorsGroup,它也有同樣的等待行爲,但不會鎖定你的UI。

+0

謝謝你的幫助!我插入了整個添加功能功能。您能否回顧一下代碼並提供您的反饋意見。 – user2229874

+0

你是否真的擁有「添加」的固定值,你沒有傳入任何參數? –

+0

我在加入函數中傳遞用戶名作爲參數,但一次只從用戶添加/獲取一個用戶名。 user.SamAccountName = userName(「c1111111」); – user2229874