C#:foreach循环到for循环COM DotNet编程泄漏的Outlook项目

本文关键字:循环 泄漏 编程 DotNet Outlook 项目 COM foreach for | 更新日期: 2023-09-27 17:59:54

all。在无缓存Exchange模式下运行Outlook 2010加载项时遇到问题。您可以拨打Exchange的电话数量似乎有限制。从这篇文章中,我的同事们认为,如果我们解决了所有的泄漏问题,那么就不会有任何问题。因此,我有一个下面的函数,它返回用foreach循环编写的IEnumerable。我试图将其转换为for循环,但无论它有多深,我都无法获得我想要的所有文件夹,而且奇怪的是,我需要以1开始计数,否则我会出现索引越界错误。有人能看看我的for循环,告诉我为什么它没有从根文件夹中获取所有子文件夹吗?例如,使用foreach循环,我可以获得folderA、folderB和folderC以及folderC中的所有子文件夹,但使用For循环,我只能获得folderB、folderC和folderA。

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; }
        }           
    }

对于环路:

for(int count=1;rootFolder.Folders.count>count;count++){if(rootFolder.Folders[count].Name.Equals(folderToSkip)&amp!一串IsNullOrEmpty(要跳过的文件夹){持续}var t=根文件夹。文件夹[count]为Outlook。文件夹收益率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循环,但仍然无法正确运行。我真的很挣扎。有人能告诉我我哪里做错了什么吗?

C#:foreach循环到for循环COM DotNet编程泄漏的Outlook项目

您的for循环没有得到子文件夹,因为您忘记实现foreach循环中存在的递归。您将进入根级别,并获取该根的所有子级,但随后它将停止。您需要递归地与每个子文件夹进行交互,以便一路深入。

编辑以添加:

注意这一行foreach(getChildFolders(t,folderToSkip)中的Outlook.Folder i){yield return i;}

这是您缺少的递归。

您对泄漏的看法是正确的,您需要小心执行任何类型的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);
    }        
}

然后你必须打电话给元帅。在所有已通过该方法生成的文件夹上释放ComObject。