1

一度に 1 人のユーザーを特定のグループ (管理者など) に追加する関数を作成しましたが、GroupPrinciple(5-10 秒) および group.members.add(5-10 秒) 呼び出しで応答するのに時間がかかりすぎるようですアプリの速度が遅くなり、応答するのに約 15 ~ 20 秒かかります。これを行うより速い方法はありますか?

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

}
4

2 に答える 2

0

毎回同じグループを使用しているため、ユーザーの追加からグループの検索をリファクタリングして、一度に複数のユーザーを追加できるかどうかを確認してください。

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すると、これが非常に簡単になります。静的コンストラクターでタスクを開始し、Add 関数で結果を取得するだけです。.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 がロックされることはありません。

于 2015-06-12T15:38:21.387 に答える