c# - 运行两个任务时出现内存不足异常 (Outlook VSTO)
问题描述
我正在为 Outlook 2016 开发 ac# 插件。在某些过程中,我需要删除邮件项目类别和用户属性。我试图通过同时从收件箱/已发送文件夹中删除属性来做到这一点。为此,我开始了 2 个新的tasks
:
Task.Factory.StartNew(() => RunRemovingExistingVisualIndicationFromInboxFolder(), GlobalEnvironmentMethods.removeExistingVisualIndicationFromInboxFolderCancellationToken.Token);
Task.Factory.StartNew(() => RunRemovingExistingVisualIndicationFromSentFolder(), GlobalEnvironmentMethods.removeExistingVisualIndicationFromInboxFolderCancellationToken.Token);
在我下面的代码中,是删除这些属性的功能(例如,我只在我的收件箱文件夹中附加处理邮件项目。注意:我的已发送文件夹使用相同的代码。我只更改了 Outlook 文件夹以使用“已发送“ 文件夹。)
public static void RunRemovingExistingVisualIndicationFromInboxFolder()
{
NLogMethods.GetInstance().WriteInfoLog("[ADDITIONALVISUALINDICATIONSETTINGSFORM -> RUNREMOVEEXISTINGVISUALINDICATION()]: Processing " + "\"" + "Inbox" + "\"" + " folder started.");
Outlook.Items folderItemsInbox = null;
folderItemsInbox = OutlookMethods.currentOAppNameSpace.Stores[JSONMethods.ReadAddInSetting().AddInPreferredMailBoxStoreName].GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox).Items;
if (folderItemsInbox.Count > 0)
{
for (int i = 1; i <= folderItemsInbox.Count; i++)
{
totalProcessedInboxMailItems++;
if (GlobalEnvironmentMethods.removeExistingVisualIndicationFromInboxFolderCancellationToken.IsCancellationRequested)
{
GlobalEnvironmentMethods.globalProcessingRemovingVisualIndicationTaskState = false;
GlobalEnvironmentMethods.removeExistingVisualIndicationFromInboxFolderCancellationToken.Dispose();
GlobalEnvironmentMethods.removeExistingVisualIndicationFromInboxFolderCancellationToken = null;
GlobalEnvironmentMethods.ServiceProcedures.ReleaseComObject(new[] { folderItemsInbox });
totalProcessedInboxMailItems = 0;
NLogMethods.GetInstance().WriteWarnLog("[ADDITIONALVISUALINDICATIONSETTINGSFORM -> RUNREMOVEEXISTINGVISUALINDICATION()]: The task was cancelled by user.");
return;
}
else
{
Outlook.MailItem mailItemObjectInbox = null;
mailItemObjectInbox = folderItemsInbox[i] as Outlook.MailItem;
if (mailItemObjectInbox != null)
{
if (mailItemObjectInbox.Class == Outlook.OlObjectClass.olMail)
{
bool mailItemChanged = false;
if (mailItemObjectInbox.Categories != null)
{
if (mailItemObjectInbox.Categories.Contains(AddInEnvironmentMethods.CRM_CATEGORY_NAME.ToLower()) || mailItemObjectInbox.Categories.Contains(AddInEnvironmentMethods.CRM_CATEGORY_NAME.ToUpper()))
{
//When mail item has many categories, our need remove from string only our "CRM" category, other categories, include char "," will be applied correctly by Outlook automatically;
//i.e. if mail item has 3 cat.: Green category, CRM, Yellow category -> after removing "CRM" cat. category text was: Green category, , Yellow category, but don't worry, Outlook will apply this string absolutely correctly;
//Note: Mail item categories is case sensitive;
mailItemChanged = true;
if (mailItemObjectInbox.Categories.Contains(AddInEnvironmentMethods.CRM_CATEGORY_NAME.ToLower()))
{
mailItemObjectInbox.Categories = mailItemObjectInbox.Categories.Remove(mailItemObjectInbox.Categories.IndexOf(AddInEnvironmentMethods.CRM_CATEGORY_NAME.ToLower()), AddInEnvironmentMethods.CRM_CATEGORY_NAME.Length);
}
else if (mailItemObjectInbox.Categories.Contains(AddInEnvironmentMethods.CRM_CATEGORY_NAME.ToUpper()))
{
mailItemObjectInbox.Categories = mailItemObjectInbox.Categories.Remove(mailItemObjectInbox.Categories.IndexOf(AddInEnvironmentMethods.CRM_CATEGORY_NAME.ToUpper()), AddInEnvironmentMethods.CRM_CATEGORY_NAME.Length);
}
}
}
if (mailItemObjectInbox.UserProperties.Find(AddInEnvironmentMethods.CRM_COLUMN_NAME) != null)
{
mailItemChanged = true;
mailItemObjectInbox.UserProperties.Find(AddInEnvironmentMethods.CRM_COLUMN_NAME).Delete();
}
if (mailItemChanged)
{
mailItemObjectInbox.Save();
}
GlobalEnvironmentMethods.ServiceProcedures.ReleaseComObject(new[] { mailItemObjectInbox });
}
else
{
GlobalEnvironmentMethods.ServiceProcedures.ReleaseComObject(new[] { mailItemObjectInbox });
}
}
}
}
}
else
{
GlobalEnvironmentMethods.ServiceProcedures.ReleaseComObject(new[] { folderItemsInbox });
}
GlobalEnvironmentMethods.globalProcessingRemovingVisualIndicationTaskState = false;
GlobalEnvironmentMethods.removeExistingVisualIndicationFromInboxFolderCancellationToken.Dispose();
GlobalEnvironmentMethods.removeExistingVisualIndicationFromInboxFolderCancellationToken = null;
NLogMethods.GetInstance().WriteInfoLog("[ADDITIONALVISUALINDICATIONSETTINGSFORM -> RUNREMOVEEXISTINGVISUALINDICATION()]: Processing " + "\"" + "Inbox" + "\"" + " folder completed.");
}
我的收件箱文件夹中处理邮件项目的计数 = 988 项。但是,有时此函数会捕获异常“内存不足”。我不明白为什么会出现这种情况......
注意:这行代码发生异常:
if (mailItemObjectInbox.Categories != null) //Out of memory ex...
我在做什么不正确?谢谢
解决方案
推荐阅读
- templates - 在 Gatsby-node.js 之外访问/替换 CreatePage
- xpath - 解析 xml 并使用 ansible 替换 xml 标记中的字符串值
- gcc - 如何将文件名作为 C++ 编译参数传递以在介子构建中使用?
- python - 如何编写具有固定输入行的 Python 终端应用程序?
- mysql - Spring CriteriaBuilder 查询 JSONArray 数据
- shell - Shell:如果超时,如何停止命令行?
- python - ttk 样式不适用于 python 2.7.18
- java - Spring Boot 应用程序未启动可能是由于依赖关系
- wpf - 通过 Wix 设置项目将应用程序添加到“选择默认浏览器”
- javascript - 如何在 Code.org App Lab 中显示表格中的值?