1

我一直在寻找找出已经搜索了多少页面,以便我可以多线程搜索

示例 假设 Active Directory 有 5000 台计算机。Active Directory 一次查询只会返回 1000 台计算机。以下代码将返回 5 页的 1000 个结果。我将如何计算 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,第二个获得其余线程。请注意,如果第一个线程进行查询,并且其中一台计算机在第二个线程进行查询之前被删除,会发生什么情况。第 2501 台计算机刚好在第一个线程的范围之外,然后就在第二个线程的范围之外。您不会在查询中找到这台计算机。

我将假设您想要多线程,因为 FindAll 方法花费的时间太长。通过将 PageSize 设置为 Integer.MaxValue,您将强制 DC 在向您发送结果之前处理整个查询。如果您希望 FindAll 更快地返回,请设置较小的页面大小。只要您设置页面大小,DirectorySearcher 就会抽象出它必须向服务器请求更多结果的事实(否则它只返回前 1000 个结果)。另一件需要注意的是,在 Server 2008 之前,objectClass 属性没有被索引

最后,如果您确实想在多个线程之间分配页面,请使用System.DirectoryServices.Protocols 命名空间。它的级别比 System.DirectoryServices 低,因此您可以执行诸如异步搜索之类的操作并自己请求页面

于 2012-12-18T03:22:45.347 回答