почему эта точка останова не попадает в этот Parallel.ForEach ()? - PullRequest
0 голосов
/ 11 июня 2018

У меня есть метод ниже, который содержит 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;
}
...