簡體   English   中英

優化Outlook加載項

[英]Optimizing Outlook Add-Ins

我的Outlook 2007外接程序工作得很好,直到必須移動大量郵件為止。 郵件列表是這樣獲得的

Items itemObj = lNamespace.GetFolderFromID(Settings.Default.InputFolder).Items;

        List<MailItem> totalMailItems = new List<MailItem>();

        foreach (MailItem mailItem in itemObj)
        {
            totalMailItems.Add(mailItem);
        }

        //Dispose of itemObj
        itemObj = null;


            MAPIFolder blueFold = lNamespace.GetFolderFromID(Settings.Default.BlueFolder);
        MAPIFolder greenFold = lNamespace.GetFolderFromID(Settings.Default.GreenFolder);
        MAPIFolder orangeFold = lNamespace.GetFolderFromID(Settings.Default.OrangeFolder);
        MAPIFolder redFold = lNamespace.GetFolderFromID(Settings.Default.RedFolder);


    foreach (MailItem mailItem in totalMailItems)
        {
            MailItem xMail = mailItem;
            MessageRelevance mRel = new MessageRelevance();
            mRel = Process_MailItem(ref xMail);              

            xMail.Save();
            switch(mRel)
            {
                case MessageRelevance.Red:
                    xMail.Move(redFold);
                    _lvl2++;
                    break;
                case MessageRelevance.Orange:
                    xMail.Move(orangeFold);
                    _lvl1++;
                    break;
                case MessageRelevance.Blue:
                    xMail.Move(blueFold);
                    _nullLev++;
                    break;
                case MessageRelevance.Green:
                    xMail.Move(greenFold);
                    _lvl0++;
                    break;
            }            

            xMail = null;
        }

我將xMail設置為mailItem的原因是因為我不能使用mailItem作為引用,它是只讀的。 該程序的其余部分現在運行良好,我只是想弄清楚如何更快地移動這些項目。 我必須先致電保存嗎? 還是只是一個額外的電話?

我不確定您實際移動了多少郵件,因此我假設很多。

可能存在的一件事是Save()方法可能是代碼中的瓶頸。 我在Excel加載項中遇到了類似的類型問題,該加載項將文件復制到了多個位置。 提高速度並保持excel響應速度的解決方案是使用異步委托調用,如為基於.NET的應用程序提供具有多個線程的快速響應的UI中所述

因此,在您的示例中,我將循環的內容包裝在totalMailItems 請注意,以下代碼可能不是100%正確,但希望它能為您提供足夠的想法和指導。

private delegate void SaveEmail(MailItem mailItem);

foreach (MailItem mailItem in totalMailItems)
{
    SaveEmail save = SaveMailItem; 
    IAsyncResult saveResult = save.BeginInvoke(mailItem, SaveCallBack, "MailItem Saved") 
    xMail = null;
}

private void SaveCallBack(IAsyncResult result)
{ // do stuff here if you want to... }

private void SaveMailItem(MailItem mailItem)
{
    MailItem xMail = mailItem;
    MessageRelevance mRel = new MessageRelevance();
    mRel = Process_MailItem(ref xMail);              

    xMail.Save();
    switch(mRel)
    {
        case MessageRelevance.Red:
            xMail.Move(redFold);
            _lvl2++;
            break;
        case MessageRelevance.Orange:
            xMail.Move(orangeFold);
            _lvl1++;
            break;
        case MessageRelevance.Blue:
            xMail.Move(blueFold);
            _nullLev++;
            break;
        case MessageRelevance.Green:
            xMail.Move(greenFold);
            _lvl0++;
            break;
    } 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM