【问题标题】:Slow performance with RDOFolder objectRDOFolder 对象的性能下降
【发布时间】:2017-07-06 13:40:59
【问题描述】:

我正在编写一个修改 Outlook 文件夹的实用程序脚本。为此,我通过 COM 接口(Windows Script Host/JScript)使用Redemption v5.14。

我有这两个函数可以为我获取 RDOFolder 的所有子文件夹的一些信息数组:

// enumerate all subfolders of an RDOFolder
function getFolderList(rdoFolder) {
    if (!rdoFolder) return;

    return foldersToArray(rdoFolder.Folders).map(getFolderDetails);
}

// pull out some details about a single RDOFolder
function getFolderDetails(rdoFolder) {
    if (!rdoFolder) return;

    return {
        name: rdoFolder.Name,
        entryID: rdoFolder.EntryID,
        defaultMessageClass: rdoFolder.DefaultMessageClass,
        folderCount: rdoFolder.Folders.Count
    };
}

foldersToArray() 只是将Folders 集合枚举到一个 JS 数组中。

对于较大的子文件夹列表,这需要大量时间 - 对于 40 个子文件夹,大约需要 12 秒。

当我将最后一个函数简化为检索较少信息的函数时:

// pull out some details about a single RDOFolder
function getFolderDetails(rdoFolder) {
    if (!rdoFolder) return;

    return {
        folderCount: rdoFolder.Folders.Count
    };
}

那么性能很好(40 个子文件夹需要几十毫秒)。

但不知何故,即使访问 RDOFolder 的 Name 属性(或任何其他属性)也会增加异常开销。

为什么会发生这种情况,有没有办法改善它?

【问题讨论】:

    标签: com jscript outlook-redemption


    【解决方案1】:

    RDOFolder 使用延迟初始化 - 访问任何属性都会强制 Redemption 通过调用 IMAPISession::OpenEntry 来初始化 RDOFolder。为避免打开底层 MAPI 文件夹,您可以使用 ExecSQL (RDOFolder.Folders.MAPITable.ExecSQL) 检索 PR_DISPLAY_NAME_W, PR_ENTRYID, PR_CONTAINER_CLASS_W, PR_SUBFOLDERS 属性 - 请参阅 http://www.dimastr.com/redemption/mapitable.htm#ExecSQL

    【讨论】:

    • 好吧,这行得通,而且速度也很快。谢谢!我唯一不太明白的是这给我的 EntryID 的格式。这与我从 RDOFolder 上的 EntryID 属性得到的不同,RDOStore.GetFolderFromID() 似乎不喜欢它。
    • 请求PR_LONGTERM_ENTRYID_FROM_TABLE (DASL "http://schemas.microsoft.com/mapi/proptag/0x66700102") 得到正确的值。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多