Vb.net 对MailItem重复的保存操作会导致异常-可能是由于内联回复功能

Vb.net 对MailItem重复的保存操作会导致异常-可能是由于内联回复功能,vb.net,outlook,vsto,outlook-addin,Vb.net,Outlook,Vsto,Outlook Addin,我正在使用VSTO开发Outlook 2013外接程序。 如果ribbonID为Mail.Read或Mail.Compose,则功能区将显示一个按钮,用于执行以下操作: Public Sub waitClick(control As Office.IRibbonControl) Dim insp As Inspector = control.Context insp.Activate() '// doesnt change anything for the better

我正在使用VSTO开发Outlook 2013外接程序。
如果ribbonID为Mail.Read或Mail.Compose,则功能区将显示一个按钮,用于执行以下操作:

Public Sub waitClick(control As Office.IRibbonControl)
    Dim insp As Inspector = control.Context

    insp.Activate() '// doesnt change anything for the better
    Dim currentMail As MailItem = insp.CurrentItem

    currentMail.UserProperties("Status").Value = "WAITING"
    currentMail.Save()

End Sub
以及另一个将状态设置为“完成”的按钮。
现在,当我多次触发这些按钮中的任何一个时,它们在Save方法上失败,并引发这些异常:

"System.Runtime.InteropServices.COMException" in outlook-add-in-dummy.dll
"System.Reflection.TargetInvocationException" in mscorlib.dll
显示消息:“无法保存,因为项目已更改”

如果我随后尝试关闭显示邮件的窗口,系统会警告我未保存的更改,但尝试保存这些更改会导致错误,因为邮件已被“其他用户或窗口”更改

MailItem.Save-method上的文档说明

如果邮件项目是内联回复,则可能会对该邮件项目调用Save 失败并导致意外行为

因此,我认为问题可能在于Outlook在默认情况下右边有一个inspector窗口(尽管在应用程序对象上的inspector集合中循环始终只显示一个inspector),并且该inspector以某种方式干扰/处于内联回复模式。

我完全不知道现在该做什么。如果有任何想法,我将不胜感激

//我所描述的整个行为是非常可复制的,而不是由于与Outlook的一系列随机交互

//这里有一个无参考变量,它会产生相同的错误:
(奇怪的是,在产生这个错误之前,它现在允许我将状态字段最多切换三到四次——因此我感觉这是一种不受欢迎的缓存机制。)


错误是MAPI_E_OBJECT_已更改,这意味着在打开该项目和调用“保存”之间该项目已被修改

根据经验,尽量避免打开消息-如果需要进行更改,请打开(例如使用Namespace.GetItemfromID)、进行更改、保存、释放对该项的引用


在特定情况下,设置属性,但不要保存项目-如果项目正在显示,用户有权决定是否需要保存该项目。

好的,我现在已经发现问题可能是由于线程冲突。当UserProperty以这种方式更改时,Outlook会进入无限同步循环。COM异常错误代码是什么?ex.ErrorCode打印“-2147221239”堆栈跟踪是“Stacktrace:bei Microsoft.Office.Interop.Outlook.\u MailItem.Save()bei Outlook\u add\u in\u dummy.ribbon\u extension.waitClick(IRibbonControl控件)”我更新了我的原始帖子,向您展示了我所做的一些修改-我在代码中避免了任何引用,但问题仍然存在。在这种情况下,恐怕不是由用户决定是否需要保存项目,因此这不是一个真正的选项。然而,我已经尝试过了,问题依然存在!一旦我重新打开邮件,更改其状态并关闭并保存它,我会不止一次被告知其他内容已更改它。非常感谢您的帮助,非常感谢。然后,您的下一个最佳选择是在检查器关闭时保存(关闭事件正在触发),并跟踪写入事件以添加您的属性(如果您还没有这样做)就在用户保存邮件之前。我发现,当您双击一封新邮件时,第一件要更改的事情是“未读”,当收件箱中的邮件是新邮件时,这是真的(现在为假)。我发现PropertyChange事件似乎比write事件更有益。每次我检测到属性更改时,我都会保存电子邮件。此外,我通过inspector收集电子邮件中所做的所有更改,然后使用Namespace.GetItemfromID延迟更改。我已经编写代码好几个月了,但终于到了我再也看不到那个错误的地步。
Dim mailID As String = addIn.Application.ActiveInspector.CurrentItem.EntryID
addIn.Application.GetNamespace("MAPI").GetItemFromID(mailID).UserProperties("Status").Value = "WAIT"
Try
    addIn.Application.GetNamespace("MAPI").GetItemFromID(mailID).Save()
Catch ex As System.Runtime.InteropServices.ComException
End Try