【问题标题】:Outlook Addin: Avoid open items limitOutlook 插件:避免打开项目限制
【发布时间】:2014-09-20 00:04:06
【问题描述】:

我的 Outlook 插件 (VB.net) 遍历邮件项目并计算它们的大小,如下所示:

For Each m in fol.Items
     b = b + m.Size
Next

这很好用,除非 Exchange 文件夹中有超过 250 个项目,在这种情况下我得到一个异常 Your server administrator has limited the number of items you can open simultaneously. 我从中了解到我的代码在迭代时不会释放每个邮件项目,所以我'我最终在 Outlook 中有数百个'打开'文件。

我试图在循环中添加m.Close() 行,但我see 认为这不是所需的行为。

如何在处理对象时释放它们?

【问题讨论】:

    标签: vb.net outlook vsto outlook-addin


    【解决方案1】:

    首先,Marshal.ReleaseComObject 是个好主意。其次,.Net 中的“for each”循环倾向于保留引用的所有集合项,直到循环退出 - 改用“for”循环。

    最重要的是,绝对没有理由打开文件夹中的所有项目 - 使用 Table 对象 (MAPIFolder.GetTable)。见http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.table(v=office.14).aspx

    【讨论】:

    • 感谢您的反馈,尤其是在使用 Table 对象方面。我今天实现了它,它在我的环境中快了大约 40 倍 :)
    • 有没有办法从表格集结果中移动项目?看起来我需要将它映射回 Outlook.MailItem(使用 GetItemById()),并失去 GetTable() 的所有好处。
    • 为什么不简单地将条目 ID 复制到您自己的列表或地图中?
    【解决方案2】:

    我把代码改成

    For Each m in fol.Items
        b = b + m.Size
        Marshal.ReleaseComObject(m)
    Next
    

    看起来效率低下,但确实有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 2018-04-20
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多