Поток пользовательского интерфейса Outlook блокируется при преобразовании сообщений в eml с помощью погашения Outlook
Поток пользовательского интерфейса Outlook блокируется при конвертации сообщения в eml с помощью выкупа
Я разрабатываю надстройку для Outlook для синхронизации электронной почты на сервере как eml. Когда надстройка запускается, она запускает таймер и проверяет наличие новых писем, а затем загружает их. Для каждого письма я буду конвертировать их в eml, используя outlook Redemption. Это работает, но я обнаружил, что во время конвертации пользовательский интерфейс Outlook будет заблокирован. Я использую следующий код, чтобы сделать преобразование. Я также попробовал 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;
}
}
1 ответ
Вы должны иметь возможность запускать этот код во вторичном потоке - сохраните значение свойства Application.Session.MAPIOBJECT в глобальной переменной / классе, а затем присвойте это значение свойству RDOSession.MAPIOBJECT объекта RDOSession, который вы создаете в вторичная нить.
В связанной заметке вы также можете использовать эту технику в основном потоке - нет никаких причин для RDOSession.LOgon из надстройки Outlook, поскольку у вас уже есть сеанс MAPI, используемый Outlook.