У меня есть метод ниже, который содержит Parallel.ForEach (). Строка кода с комментарием «reference1» справа находит «My_Group_X», как и ожидалось (когда строка кода раскомментирована), а затем попадает в строку кода со встроенным комментарием «reference2». Однако, если я выполняю полный FindAll () без дополнительной строки фильтрации, отмеченной «reference1», то последующая строка, отмеченная «reference2», не попадает. Такое поведение кажется противоречащим логике, поскольку открытый FindAll (), который возвращает все записи, обязательно должен включать запись, обнаруженную при применении определенного фильтра. Есть идеи, в чем может быть проблема или как ее решить? Каждый раз я получаю одни и те же результаты:
private async Task GetADGroupADUserMapFromAD(string domainName)
{
//get domain id
var domainId = domainLookup.Where(x => x.Name == domainName).First().Id;
using (var searchContext = new PrincipalContext(ContextType.Domain, domainName))
{
var ps = new PrincipalSearcher(new GroupPrincipal(searchContext));
Parallel.ForEach(
ps.FindAll()
//.Where(x => x.Name.ToUpper() == "MY_GROUP_X") //reference1
.Select(x => x.DistinguishedName),
new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount },
() => new PrincipalContext(ContextType.Domain, domainName),
(distinguishedName, loopState, threadLocalContext) =>
{
var threadLocalGroup = GroupPrincipal.FindByIdentity(
threadLocalContext, IdentityType.DistinguishedName, distinguishedName);
if (threadLocalGroup.Name.ToUpper() == "MY_GROUP_X")
{
var x = 0; //reference2
}
GetADGroupADUsersRecursive(domainId, threadLocalGroup);
return threadLocalContext;
},
threadLocalContext => threadLocalContext?.Dispose()
);
}
return;
}
работает ли это вне параллели для каждого
Помимо модификатора async в методе, имеет ли это какое-либо отношение к async-await? Какие еще предупреждения игнорируются?
похоже, что точка останова сейчас срабатывает, когда я обновляю код до ps.FindAll (). AsEnumerable (). любая идея, почему это?





Почему бы вам не преобразовать свое действие в функцию, поставить там точку останова и посмотреть, попадет ли она. В противном случае возможно, что исходный
ps.FindAll().......не возвращает коллекцию.