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)&!一串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循环,但仍然无法正确运行。我真的很挣扎。有人能告诉我我哪里做错了什么吗?
您的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。