使用兑换将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;
}
}
答案 0 :(得分:1)
您应该能够在辅助线程上运行该代码 - 将Application.Session.MAPIOBJECT属性的值保存在全局/类变量中,然后将该值分配给您的RDOSession对象的RDOSession.MAPIOBJECT属性在辅助线程上创建。
在相关的说明中,您也可以在主线程上使用该技术 - 由于您已经拥有Outlook使用的MAPI会话,因此没有理由从Outlook插件中部署RDOSession.LOgon。