Multithreading 在多线程场景中使用GetMessageFromID

Multithreading 在多线程场景中使用GetMessageFromID,multithreading,outlook,outlook-redemption,Multithreading,Outlook,Outlook Redemption,我读过一篇关于使用多线程赎回的常见问题,但我不清楚什么是“可创建的赎回对象”? 我们使用赎回从发送的邮件中获取正确的发送日期和internet邮件id。 我从主线程初始化全局对象,并从主线程设置MAPISESSION,方法如下: public void Init() { _rdoSession.Logon(); _rdoSession.MAPIOBJECT = ThisAddIn.Instance.Session.MAPIOBJECT; _storeId = ThisA

我读过一篇关于使用多线程赎回的常见问题,但我不清楚什么是“可创建的赎回对象”? 我们使用赎回从发送的邮件中获取正确的发送日期和internet邮件id。 我从主线程初始化全局对象,并从主线程设置MAPISESSION,方法如下:

public void Init()
{
    _rdoSession.Logon();
    _rdoSession.MAPIOBJECT = ThisAddIn.Instance.Session.MAPIOBJECT;

    _storeId = ThisAddIn.Instance.Session.DefaultStore.StoreID;
}
然后我以这种方式获取项目:

public RDOMail GetEmailFromServer(string entryID, string storeID = null)
{
    try
    {
        if (storeID == null)
        {
            storeID = _storeId;
        }
        return _rdoSession.GetMessageFromID(entryID, storeID, MAPI_NO_CACHE | MAPI_BEST_ACCESS);
    }
    catch (Exception e)
    {
        Log.Error(e, "Error getting message from server with RDO");
    }

    return null;
}

public Task<RDOMail> GetEmailFromServerAsync(string entryID, string storeID = null)
{
    return Task.Run(() => GetEmailFromServer(entryID, storeID));
}
公共RDOMail GetEmailFromServer(字符串entryID,字符串storeID=null) { 尝试 { if(storeID==null) { storeID=\u storeID; } return rdoSession.GetMessageFromID(entryID、storeID、MAPI_NO_CACHE | MAPI_BEST_ACCESS); } 捕获(例外e) { Log.Error(e,“使用RDO从服务器获取消息时出错”); } 返回null; } 公共任务GetEmailFromServerAsync(字符串entryID,字符串storeID=null) { 返回Task.Run(()=>GetEmailFromServer(entryID,storeID)); } 它似乎可以工作,但在这种情况下是否使用共享会话? 据我所知,RDOMail是一个COM对象,它被传递到另一个线程(并在那里用Marshal.ReleaseComObject清除)。这样可以吗,还是我们最好在一个线程中完成所有工作


也许有更简单的方法从服务器获取internet消息id和发送日期?它是否在我们的实现中下载整个电子邮件(带附件)?

首先,没有理由调用
登录
并设置
MAPIOBJECT
属性。只需正确设置MAPIOBJECT

其次,由于您的代码是在COM加载项中运行的,因此无需创建全局
RDOSession
(除非您确实在使用它)-Outlook会在主线程上为您初始化MAPI系统


第三,在单独线程(
Task.Run
)中运行的代码需要自己的
RDOSession
来初始化该线程上的MAPI。为此,需要将
ThisAddIn.Instance.Session.MAPIOBJECT
存储在主线程上调用的
Init()
方法的单独变量中。然后,在单独线程中运行的代码将需要创建自己的
RDOSession
,并将is
MAPIOBJECT
属性设置为主线程上的变量集-这样您就不会在线程之间封送任何OOM对象(Outlook确实不喜欢)

谢谢!那么对象发布和附件下载呢?使用GetMessageFromID时是否也下载附件?否,附件数据仅在您实际访问时下载。