优化 Outlook 加载项

发布于 2024-08-27 02:01:27 字数 1811 浏览 3 评论 0原文

我的 Outlook 2007 Addin 工作得非常好,直到我必须移动大量邮件为止。 邮件项目列表是这样获取的

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 吗?或者这只是一个额外的电话?

My Outlook 2007 Addin works very well, until the point where I have to move mass amounts of messages.
The list of mail items is obtained like this

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;
        }

The reason I set xMail to mailItem is because I can't use mailItem as a reference, it's readonly. The rest of the program works great now, I'm just trying to figure out how to move these items faster. Do I have to call Save before? Or is that just an extra call?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

虐人心 2024-09-03 02:01:27

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

可能出现问题的一件事是 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;
    } 
}

I am not sure how many mail items you are actually moving, so I will assume alot.

The one thing that may be the issue is that the Save() method could be the bottleneck in your code. I had a similar type issue with an excel add-in that copied files to several locations. The solution to improve the speed and keep excel responsive was to use Asynchronous Delegate Invocation as described in Give Your .NET-based Application a Fast and Responsive UI with Multiple Threads.

So in your example I would wrap the contents of the loop on totalMailItems. Note the code below may not be 100% correct but I hope its enough of an idea and guidance to help you out.

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;
    } 
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文