【问题标题】:Optimizing Outlook Add-Ins优化 Outlook 加载项
【发布时间】:2010-03-31 12:13:37
【问题描述】:

我的 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 作为参考,它是只读的。该程序的其余部分现在运行良好,我只是想弄清楚如何更快地移动这些项目。我必须先调用保存吗?或者这只是一个额外的电话?

【问题讨论】:

    标签: c# outlook-addin


    【解决方案1】:

    我不确定您实际移动了多少邮件,所以我会假设很多。

    可能存在问题的一件事是Save() 方法可能是代码中的瓶颈。我在将文件复制到多个位置的 excel 加载项中遇到了类似的类型问题。提高速度和保持 excel 响应的解决方案是使用 Give Your .NET-based Application a Fast and Responsive UI with Multiple Threads 中所述的异步委托调用。

    因此,在您的示例中,我会将循环的内容包装在 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;
        } 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      相关资源
      最近更新 更多