为什么在这个Parallel.ForEach()中没有遇到这个断点?

时间:2018-06-11 05:06:14

标签: c# .net parallel-processing async-await parallel.foreach

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

0 个答案:

没有答案