c# – 通过邮件项目循环内存不足
嗨,我有一个Outlook com插件,正在为我做一些简单的搜索技巧.我是将它放在一起的一部分,但我遇到了内存不足的问题.这个过程非常简单,基本上循环遍历outlook文件夹,检查每个mailItem是否匹配.给定循环重新初始化变量每次我都希望垃圾收集器跟上,但是当我观察内存时,它会丢失~10m / sec,直到系统内存不足并且我得到未处理的异常.
这是代码的一部分 private void FindInFolder(Outlook.MAPIFolder FolderToSearch) { Outlook.MailItem mailItem; Outlook.MAPIFolder ParentFolder; int counter = 0; StatusBar.Text = "Searching in Folder " + FolderToSearch.FolderPath + "/" + FolderToSearch.Name; StatusBar.Update(); this.Update(); foreach (COMObject item in FolderToSearch.Items) { counter++; if (counter % 100 == 0) { StatusBar.Text = FolderToSearch.FolderPath + "/" + FolderToSearch.Name + " item " + counter + " of " + FolderToSearch.Items.Count; StatusBar.Update(); if (counter % 1000 == 0) { GC.Collect(); } } if (item is Outlook.MailItem) { mailItem = item as Outlook.MailItem; if (IsMatch(mailItem)) { if (mailItem.Parent is Outlook.MAPIFolder) { ParentFolder = mailItem.Parent as Outlook.MAPIFolder; ResultGrd.Rows.Add(mailItem.EntryID,ParentFolder.FolderPath,mailItem.SenderName,mailItem.Subject,mailItem.SentOn); } } } mailItem = null; } } 哪个电话 private Boolean IsMatch(Outlook.MailItem inItem) { Boolean subBool = false; Boolean NameBool = false; try { if (null != inItem) { if (SubjectTxt.Text != "") { if (inItem.Subject.Contains(SubjectTxt.Text)) { subBool = true; } } else { subBool = true; } if (NameTxt.Text != "") { if (inItem.Sender != null) { if (inItem.Sender.Name.Contains(NameTxt.Text)) { NameBool = true; } } } else { NameBool = true; } return subBool && NameBool; } } catch (System.Runtime.InteropServices.COMException ce) { if (ce.ErrorCode == -2147467259) { //DO nothing just move to the next one } else { MessageBox.Show("Crash in IsMatch error code = " + ce.ErrorCode + " " + ce.InnerException); } } return false; } 请原谅底部的所有错误捕获部分和GC.collect它们是我尝试找出错误并释放内存的一些尝试. 请注意,FindInFolder也会被新线程调用,因此我可以在继续搜索时与结果进行交互. 到目前为止我尝试了什么: 使变量本地化为函数而不是类,因此G可以检索,但是’item’中最常用的变量因为它是foreach的一部分,所以它必须以这种方式声明. 每1000个mailItems做一个手动GC,这没有任何区别. 由于某种原因,它需要大量的内存只是循环遍历项目,GC永远不会释放它们. 请注意我使用的是netoffice而不是VSTO for Com addin. 解决方法
首先:这是NetOffice代码,你不需要NetOffice中的Marshal.ReleaseComObject. (此外,此处调用ReleaseComObject无用)代替实例使用Dispose().
请记住:NetOffice为您处理COM代理(这就是为什么它允许在NetOffice中使用两个2点). 在每个循环结束时使用item.Dispose()来删除/释放项目实例或在foreach之后使用以下内容 FolderToSearch.Dipose() FolderToSearch.DisposeChildInstances() 下一个: Outlook._Items items = FolderToSearch.Items; COMObject item = null; do { if (null == item) item = items.GetFirst() as COMObject; if (null == item) break; // do what you want here item.Dispose(); item = items.GetNext() as COMObject; } while (null != item); 这也应该有效. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 自动调节MSHFlexGrid控件的行高列宽
- react-native – 在React Native中记录当前目录/
- NoSQL数据库-MongoDB和Redis
- ruby-on-rails – Rails 5 DEPRECATION警告:不推
- C#统计字符串中数字个数的方法
- objective-c – NSString stringByReplacingPerc
- 四极管:WinCE Bootloader学习笔记之 OEMPlatfor
- WizISP Flash Programmer 是什么?
- Swfit4.0中JSON与模型原生互转(JSONEncoder/JSON
- objective-c – 如何在Objective C中发送supervi