C #: цикл foreach для цикла программирования COM-DotNet с утечкой элементов Outlook - PullRequest
0 голосов
/ 22 июня 2011

все.У меня проблемы с запуском надстроек Outlook 2010 в режиме без кэширования Exchange.Кажется, есть ограничение на количество звонков в Exchange.Из этой статьи мои коллеги считают, что если мы позаботимся обо всех проблемах с утечками, тогда не должно быть никаких проблемТаким образом, у меня есть следующая функция, которая возвращает IEnumerable, который был написан с помощью цикла foreach.Я попытался преобразовать его в цикл for, но я не могу получить все нужные мне папки, независимо от их глубины, и также странно, что мне нужно начинать счет с 1, иначе я получаю ошибку Index of of bound,Может кто-нибудь взглянуть на мой цикл for и сказать, почему он не получает все дочерние папки из корневой папки?Например, с помощью цикла foreach я могу получить папки A, folderB и folderC со всеми дочерними папками в папке C, но с помощью цикла for я могу получить только папки A, folderB и folderC.

Цикл Foreach:

private static IEnumerable<Outlook.Folder> getChildFolders(Outlook.Folder rootFolder, string folderToSkip)
    {
        foreach (Outlook.Folder t in rootFolder.Folders)
        {
            if (t.Name.Equals(folderToSkip) && !String.IsNullOrEmpty(folderToSkip))
            {
                continue;
            }
            yield return t;
            foreach (Outlook.Folder i in getChildFolders(t, folderToSkip)) { yield return i; }
        }           
    }

Для цикла:

для (int count = 1; rootFolder.Folders.Count> count; count ++) {if (rootFolder.Folders [count] .Name.Equals (folderToSkip) &&! String.IsNullOrEmpty (folderToSkip)) {продолжить;} var t = rootFolder.Folders [count] as Outlook.Folder;yield return t;

            for (int i = 1; t.Folders.Count > i; i++)
            {
                var f = getChildFolders(t, folderToSkip).OfType<Outlook.Folder>().ToList()[i] as Outlook.Folder;
                yield return f;
            }
        }                  

Я не думаю, что цикл foreach вызовет какую-либо утечку в Outlook.Я попробовал второй цикл for, как описано выше, но я все еще не могу запустить его правильно.Я действительно борюсь с этим.Может кто-нибудь показать мне, что и где я неправильно понимаю?

Ответы [ 2 ]

1 голос
/ 22 июня 2011

Ваш цикл for не получает дочерние папки, потому что вы забыли реализовать рекурсию, существующую в цикле foreach.Вы войдете в корневой уровень и получите все дочерние элементы корневого уровня, но на этом он остановится.Вам нужно рекурсивно взаимодействовать с каждой дочерней папкой, чтобы детализировать все детали.

Изменить, чтобы добавить:

Обратите внимание на эту строку foreach (Outlook.Folder i в getChildFolders (t, folderToSkip)) {yield return i;}

Это рекурсия, которую вам не хватает.

0 голосов
/ 23 июня 2011

Вы правы насчет утечки, вы должны быть осторожны при выполнении любого цикла for.

Что вы пытаетесь сделать, зачем вам ссылка на все папки?

Если нужно, это то, как вы делаете это без утечки.

private static IEnumerable<Outlook.Folder> getChildFolders(Outlook.Folder rootFolder, string folderToSkip)
{
    FolderCollection folders;
    try
    {
        folders = rootFolder.Folders
        foreach (Outlook.Folder t in folders)
        {
            if (t.Name.Equals(folderToSkip) && !String.IsNullOrEmpty(folderToSkip))
                continue;

            yield return t;
            foreach (Outlook.Folder i in getChildFolders(t, folderToSkip)) { yield return i; }
        }
    }
    finally
    {
        if (folders != null && Marshal.IsComObject(folders))
            Marshal.ReleaseComObject(folders);
    }        
}

Затем вам нужно вызвать Marshal.ReleaseComObject для всех папок, полученных из этого метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...