删除多个 Outlook 任务
Deleting multiple Outlook tasks
我想删除多个Outlook.TaskItem
。要删除的任务存储在 List
中。我遍历列表中的每个项目,并按照以下方式一个一个地删除每个 outlook 任务:
resultItems = folderItems.Restrict(restrictCriteria);
item = resultItems.GetFirst();
Outlook.MailItem mail = Globals.ThisAddIn.Application.CreateItem(Outlook.OlItemType.olMailItem) as Outlook.MailItem;
List<Outlook.TaskItem> taskList = new List<Outlook.TaskItem>();
do
{
if (item != null)
{if (item is Outlook.TaskItem)
{taskItem = item as Outlook.TaskItem;
if (taskItem.CreationTime >= date)
{ log.Info("Attaching task : " + taskItem.Subject + " created at
" + taskItem.CreationTime);
taskList.Add(taskItem);
mail.Attachments.Add(taskItem);
}
}
Marshal.ReleaseComObject(item);
item = resultItems.GetNext();
}
}while (item != null);
foreach (Outlook.TaskItem tItem in taskList)
{
log.Info("Deleting task with subject :" + tItem.Subject);
tItem.Delete();
}
但是它抛出这个异常:
The COM object has been separated from its underlying RCW cannot be used
堆栈跟踪:
System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc, IntPtr pCPCMD, IntPtr& ppTarget, Boolean& pfNeedsRelease)
at Microsoft.Office.Interop.Outlook._TaskItem.get_Subject()
at TMTimeCapture.ThisAddIn.DeleteMyTasks(MAPIFolder folder)
我尝试在 tItem.Delete();
之后添加 Marshal.ReleaseComObject(tItem)
也无济于事。
根据日志,此异常甚至在生成第一次迭代的日志之前就发生了。
有人可以建议我哪里出错了吗?删除多个任务的正确方法应该是什么?
编辑 2:在遍历任务以删除它们之前,我遍历同一个列表并将任务附加到 mailItem 并发送该邮件。我怀疑先前的迭代和 Marshal.ReleaseComObject(item);
的使用是否会在删除任务的下一个循环中引起问题。我已经更新了代码。请根据更新的上下文提出建议。
除了删除对 Marshal.ReleaseComObject
的调用外,您还可以使用 List<string>
并存储 TaskItem.EntryID
属性。当您需要删除任务时,您可以先使用Application.Session.GetItemFromID
打开它们,然后调用TaskItem.Delete
。
我想删除多个Outlook.TaskItem
。要删除的任务存储在 List
中。我遍历列表中的每个项目,并按照以下方式一个一个地删除每个 outlook 任务:
resultItems = folderItems.Restrict(restrictCriteria);
item = resultItems.GetFirst();
Outlook.MailItem mail = Globals.ThisAddIn.Application.CreateItem(Outlook.OlItemType.olMailItem) as Outlook.MailItem;
List<Outlook.TaskItem> taskList = new List<Outlook.TaskItem>();
do
{
if (item != null)
{if (item is Outlook.TaskItem)
{taskItem = item as Outlook.TaskItem;
if (taskItem.CreationTime >= date)
{ log.Info("Attaching task : " + taskItem.Subject + " created at
" + taskItem.CreationTime);
taskList.Add(taskItem);
mail.Attachments.Add(taskItem);
}
}
Marshal.ReleaseComObject(item);
item = resultItems.GetNext();
}
}while (item != null);
foreach (Outlook.TaskItem tItem in taskList)
{
log.Info("Deleting task with subject :" + tItem.Subject);
tItem.Delete();
}
但是它抛出这个异常:
The COM object has been separated from its underlying RCW cannot be used
堆栈跟踪:
System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc, IntPtr pCPCMD, IntPtr& ppTarget, Boolean& pfNeedsRelease)
at Microsoft.Office.Interop.Outlook._TaskItem.get_Subject()
at TMTimeCapture.ThisAddIn.DeleteMyTasks(MAPIFolder folder)
我尝试在 tItem.Delete();
之后添加 Marshal.ReleaseComObject(tItem)
也无济于事。
根据日志,此异常甚至在生成第一次迭代的日志之前就发生了。 有人可以建议我哪里出错了吗?删除多个任务的正确方法应该是什么?
编辑 2:在遍历任务以删除它们之前,我遍历同一个列表并将任务附加到 mailItem 并发送该邮件。我怀疑先前的迭代和 Marshal.ReleaseComObject(item);
的使用是否会在删除任务的下一个循环中引起问题。我已经更新了代码。请根据更新的上下文提出建议。
除了删除对 Marshal.ReleaseComObject
的调用外,您还可以使用 List<string>
并存储 TaskItem.EntryID
属性。当您需要删除任务时,您可以先使用Application.Session.GetItemFromID
打开它们,然后调用TaskItem.Delete
。