我的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响应速度的解决方案是使用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;
    }
}

09-06 05:03