我有下面的方法,其中包含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;
}