1

検索をマルチスレッド化できるように、検索されたページ数を把握するために離れて探していました

例ActiveDirectoryに5000台のコンピュータがあるとします。Active Directoryは、1000台のコンピューターに対してのみクエリを返します。次のコードは、1000件の結果を5ページ返します。すべての結果を取得するためにDirectorySearcherが何ページを実行する必要があるかをどのように把握しますか?

ありがとうございました

Dim Searcher As DirectorySearcher = New DirectorySearcher("(objectClass=computer)")
Searcher.PageSize = Integer.MaxValue
Searcher.SizeLimit = Integer.MaxValue
Dim Result As SearchResultCollection = Searcher.FindAll()
For Each i As SearchResult In Result
//some code
Next
4

1 に答える 1

2

LDAP クエリをマルチスレッド化することはお勧めしません。個々の検索は独立しています。最初のスレッドが最初の 2500 を要求し、2 番目のスレッドが残りを取得する 2 つのスレッドがあるとします。最初のスレッドがクエリを実行し、2 番目のスレッドがクエリを実行する前にそれらのコンピューターの 1 つが削除された場合に何が起こるかに注目してください。2501 番目のコンピューターは、最初のスレッドの範囲のすぐ外側にあり、次に 2 番目のスレッドの範囲のすぐ外側にありました。クエリでこのコンピューターは見つかりません。

FindAll メソッドは時間がかかりすぎるため、マルチスレッド化する必要があると仮定します。PageSize を Integer.MaxValue に設定することで、結果を送信する前に DC にクエリ全体を強制的に処理させます。FindAll をより速く返したい場合は、より小さいページ サイズを設定します。ページ サイズを設定している限り、DirectorySearcher は、サーバーにさらに結果を要求する必要があるという事実を抽象化します (それ以外の場合は、最初の 1000 件の結果のみを返します)。もう 1 つ注目すべき点は、Server 2008 より前のバージョンでは、objectClass 属性がインデックス化されていなかったことです。

最後に、ページを複数のスレッドに分散させたい場合は、System.DirectoryServices.Protocols 名前空間を使用します。System.DirectoryServices よりも下位レベルにあるため、非同期検索などを実行して、自分でページを要求できます。

于 2012-12-18T03:22:45.347 に答える