Размещение каждого объекта в конце l oop, вероятно, решит вашу проблему (result.Dispose()
). У меня были проблемы с памятью с длинными циклами при работе с AD. Предполагая, что вы работаете с тысячами результатов, и вы выделяете память для каждого, и нет никакого перерыва между обработкой каждого результата, сборщик мусора не имеет возможности очистить вас.
Но вы также без необходимости возвращаетесь в AD, чтобы найти группу, которую вы уже нашли (GroupPrincipal.FindByIdentity
). Это также увеличит потребление памяти, но также замедлит всю операцию. Вместо этого просто приведите result
к GroupPrincipal
, чтобы вы могли вызвать .GetMembers()
для него.
Не связано, но полезно: если у вас есть несколько using
блоков, вложенных таким образом, вы можете объединить их все в один блок. Это экономит ваши отступы.
Вот как будет выглядеть ваш код со всеми этими предложениями:
using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "my.domain.net", ou))
using (GroupPrincipal GroupPrin = new GroupPrincipal(context))
using (var searcher = new PrincipalSearcher(GroupPrin))
using (var results = searcher.FindAll())
{
foreach (GroupPrincipal result in results)
{
DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
string GUID = de.Guid.ToString();
string testname1 = de.Name;
string testParentName1 = de.Parent.Name;
string MasterGroupname = testname1.Substring(3, (testname1.Length - 3));
string type = testParentName1.Substring(3, (testParentName1.Length - 3));
using (var users = result.GetMembers(true))
{
foreach (Principal user in users)
{
DataRow dr1 = resultsTable.NewRow();
dr1["EmailID"] = user.UserPrincipalName;
dr1["UserID"] = user.SamAccountName;
dr1["memberOf"] = MasterGroupname;
dr1["groupType"] = type;
dr1["record_date"] = RecordDate;
user.Dispose();
}
}
result.Dispose();
}
}
Это, вероятно, будет работать, но, возможно, все еще будет намного быстрее. Использование Principal
объектов (и всего пространства имен AccountManagement
) является оберткой вокруг DirectoryEntry
/ DirectorySearcher
, которая упрощает вам задачу, но за счет производительности. Использование DirectoryEntry
/ DirectorySearcher
напрямую всегда быстрее.
Если вы хотите поэкспериментировать с этим, я написал пару статей, которые помогут: