Из-за ограничений реализации класс SearchResultCollection не может освободить все свои неуправляемые ресурсы при сборке мусора.Чтобы предотвратить утечку памяти, вы должны вызывать метод Dispose, когда объект SearchResultCollection больше не нужен.
http://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.findall.aspx
РЕДАКТИРОВАТЬ:
Я смогВоспроизведите очевидную утечку, используя perfmon, и добавив счетчик для Private Bytes в имя процесса тестового приложения (Experiment.vshost для меня)
Счетчик Private Bytes будет постоянно расти, пока приложение работает, оно запускаетсяоколо 40 000 000, а затем увеличивается примерно на миллион байтов каждые несколько секунд.Хорошей новостью является то, что счетчик возвращается в нормальное состояние (35 237 888), когда вы закрываете приложение, поэтому наконец-то происходит какая-то очистка.
Я приложил снимок экрана того, как выглядит perfmon при утечке.
Обновление:
Я пробовал несколько обходных путей, например отключение кэширования объекта DirectoryServer, но это не помогло.
Команда FindOne () не приводит к утечке памяти, но я не уверен, что вам нужно сделать, чтобы эта опция работала для вас, возможно, постоянно редактируйте фильтр, на моем контроллере AD естьтолько один домен, так что findall и findone дают тот же результат.
Я также попытался поставить в очередь 10 000 рабочих потоков, чтобы создать тот же DirectorySearcher.FindAll ().Она закончилась намного быстрее, но все равно утекла память, и на самом деле частные байты увеличились до 80 МБ, вместо 48 МБ для «обычной» утечки.
Так что для этой проблемы, если вы можете сделать FindOne ()работа для вас, у вас есть обходной путь.Удачи!