【问题标题】:Outlook UI thread is blocked when convert msg to eml using Outlook redemption使用 Outlook 兑换将 msg 转换为 eml 时,Outlook UI 线程被阻止
【发布时间】:2015-10-27 19:21:12
【问题描述】:

使用兑换将 msg 转换为 eml 时,Outlook UI 线程被阻止

我正在开发一个 Outlook 插件,以将电子邮件作为 eml 同步到服务器。当插件启动时,它会启动一个计时器并检查是否有新的电子邮件,然后上传它们。对于每封电子邮件,我将使用 Outlook Redemption 将它们转换为 eml。它可以工作,但我发现在转换过程中,outlook UI 会被阻止。我正在使用以下代码进行转换。我还尝试了 RDOSession.GetMessageFromID(mail.EntryID)。一样的。任何人

public static string ToEmlFile(this Outlook.MailItem mail)
        {
            var msgFilename = Path.ChangeExtension(Path.GetTempFileName(), ".msg");
            mail.SaveAs(msgFilename);

            var item = RDOSessionMgr.GetInstance().GetMessageFromMsgFile(msgFilename);
            var emlFilename = Path.ChangeExtension(Path.GetTempFileName(), ".eml");
            item.SaveAs(emlFilename, Redemption.rdoSaveAsType.olRFC822);

            return emlFilename;
        }

 public class RDOSessionMgr
    {
        private static Redemption.RDOSession _session;

        static RDOSessionMgr()
        {
            _session = new Redemption.RDOSession();
            _session.Logon(Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        }

        public static Redemption.RDOSession GetInstance()
        {
            return _session;
        }
    }

【问题讨论】:

    标签: outlook-redemption


    【解决方案1】:

    您应该能够在辅助线程上运行该代码 - 将 Application.Session.MAPIOBJECT 属性的值保存在全局/类变量中,然后将该值分配给您的 RDOSession 对象的 RDOSession.MAPIOBJECT 属性在辅助线程上创建。

    在相关说明中,您也可以在主线程上使用该技术 - 没有理由从 Outlook 插件内部使用 RDOSession.LOgon,因为您已经拥有 Outlook 使用的 MAPI 会话。

    【讨论】:

    • 感谢 dmitry 的回复。我正在尝试按照您的建议更新我的代码。但又遇到了一个问题。当我的插件启动时,我尝试设置 MAPIOBJECTInstance = this.Application.Session.MAPIOBJECT,但似乎 session.MAPIOBJECT 为空。我需要在某个地方初始化它吗?
    • 发生这种情况是因为 Outlook 那时还没有 MAPI 会话。使用 Application.MAPILogonComplete 事件。请注意,如果要在启动时缓存 MAPIOBJECT,则需要同时使用两者。
    • 我听从了你的建议,它有效,但我仍然面临 UI 线程卡住的问题。我发现当我调用 RDOMail.SaveAs(filename, Redemption.rdoSaveAsType.olRFC822) 时,Outlook UI 会很快卡住,我对 Outlook 的操作会推迟一点。我正在使用计时器,并且在时间之内,我使用了另一个后台线程来执行此操作,双重确保一切都是异步的。你有什么想法吗?
    • UI 会锁定多长时间?
    • 对于每个 MailItem,它可能会锁定 2 亿秒。
    猜你喜欢
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2023-03-14
    • 2018-06-23
    • 2013-02-14
    • 1970-01-01
    相关资源
    最近更新 更多