リンクのメソッドを使用すると、AD を 1500 回クエリするのではなく、1500 人のユーザーすべてをオブジェクトとして返す 1 つのクエリを実行することになります。次に foreach ループを使用して、各オブジェクトを繰り返し処理し、ユーザーの電子メールを取得します。
AD を 1500 回クエリする例は、すべてのユーザー名の ArrayList があり、次の (疑似コード) を実行した場合です。
ArrayList UserNames = new ArrayList();
Foreach(string name in UserNames)
{
//Query AD to get email of user by passing in name
}
これを高速化する 1 つの方法は、マルチスレッドを追加し、各スレッドが AD への異なるクエリを同時に処理するようにすることです。たとえば、クエリにフィルターを追加して、A で始まる名前のみを返し、1 つのスレッドがそれを処理し、別のスレッドが B で始まる名前を処理するようにすることができます。これには、AD へのクエリがさらに必要になりますが (アルファベットの各文字に対して 26、1)、返されたデータを並行して処理できます。
非常に古いドメイン コントローラーを使用していない限り、AD に負荷がかかることを心配する必要はありません。私はすべての AD (ユーザー、グループ、コンピューター、およびそれらの間の関係) を毎晩データベースにキャッシュしており、8000 人を超えるユーザーがいます。これを行うのは、AD への呼び出しが遅くなる傾向があり、ユーザーが永遠に待たされることなくグループ メンバーシップ情報を Web ページから利用できるようにするためです。このキャッシングにより、AD に対して 1 分間に数千回の呼び出しが行われますが、これは 3 時間の実行時間の間、私の会社のワークフローを妨げることはありません。
更新:
申し訳ありませんが、あなたの質問をすぐに読んで、すべての名前のリストを使用してメソッドを試みていることを見逃しました. 前に述べたようにマルチスレッド方式を使用できますが、処理する各ユーザー名を別のスレッドに渡す (制御不能にならないようにスレッドの数を制限する!!) か、1 つのクエリを使用してすべてを取得することができます。 foreach ループ内のリストにユーザーが存在するかどうかを確認します。バイナリ ツリーまたは別の並べ替えられたコレクションを使用してリストを簡単に走査できるようにすることで、ユーザーが存在するかどうかをすばやく確認できます。リストからユーザーを削除することもできます。これは、その後の検索を高速化することが判明したためです。