从 Outlook Web/Office 在线更新任务时,Office 互操作无法从 outlook 获取更新的 TaskItem

Office interop is unable to get the updated TaskItem from outlook when task is updated from Outlook Web/Office Online

我正在开发一个 outlook 插件,它从 outlook 桌面检索一个 TaskItem 并将其打开。这是我的代码。

private static Microsoft.Office.Interop.Outlook.TaskItem GetLatestTask(string entryId)
 {
    Microsoft.Office.Interop.Outlook.MAPIFolder taskFolder = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderTasks);
    List<Microsoft.Office.Interop.Outlook.TaskItem> liTask = new List<Microsoft.Office.Interop.Outlook.TaskItem>();
    foreach (Microsoft.Office.Interop.Outlook.TaskItem taskItem in taskFolder.Items)
    {
        if (taskItem.EntryID == entryId)
            return taskItem;
    }
}

这通常工作正常。但是,如果我从 outlook web/Office 在线更新任务,然后尝试使用代码获取任务,我获取的任务不会更新并且仍然包含旧值。

例如,我有一个主题名为“测试”的任务,然后我在 Outlook Web 中将其更新为“测试已更新”,我仍然会收到一个主题为“测试”的任务。

如果我在 outlook 桌面中查看任务列表,我可以看到任务的主题已经在任务列表中更新。但是打开它仍然会显示旧项目。

一旦我重新启动 Outlook,加载项就会获得更新的项目。

谁能指出我正确的方向?谢谢。

首先,遍历文件夹中的所有项目并不是一个好主意:

foreach (Microsoft.Office.Interop.Outlook.TaskItem taskItem in taskFolder.Items)
    {
        if (taskItem.EntryID == entryId)
            return taskItem;
    }

相反,您可以考虑使用 Items class 的 Find/FindNextRestrict 方法。在以下带有代码示例的文章中阅读有关它们的更多信息:

同样依靠 EntryID 属性 来识别 Outlook 中的项目并不是最好的方法。当项目移动到另一个存储区时,条目 ID 会发生变化,例如,从您的收件箱到 Microsoft Exchange Server public 文件夹,或从一个个人文件夹 (.pst) 文件到另一个 .pst 文件。除非不会移动项目,否则解决方案不应依赖于 EntryID 属性 的唯一性。相反,您可以引入自己的习惯 属性 来识别项目。

如果您使用缓存数据,很可能需要将数据与服务器端同步。 SyncObjects 是一组 SyncObject 个对象,代表用户的 Send/Receive 个组。使用 SyncObjects 属性 到 return 来自 NameSpace 对象的 SyncObjects 对象。

Set mySyncObjects = Application.GetNameSpace("MAPI").SyncObjects

SyncObject.Start 方法开始使用指定的 Send\Receive 组同步用户的文件夹。

Public Sub Sync() 
 Dim nsp As Outlook.NameSpace 
 Dim sycs As Outlook.SyncObjects 
 Dim syc As Outlook.SyncObject 
 Dim i As Integer 
 Dim strPrompt As Integer 
 Set nsp = Application.GetNamespace("MAPI") 
 Set sycs = nsp.SyncObjects 
 For i = 1 To sycs.Count 
Set syc = sycs.Item(i) 
strPrompt = MsgBox( _ 
 "Do you wish to synchronize " & syc.Name &"?", vbYesNo) 
If strPrompt = vbYes Then 
 syc.Start 
End If 
 Next 
End Sub

希望在那之后,您的项目将更新为新数据。