枚举pst项时出错

时间:2013-11-22 04:26:37

标签: c# outlook

                    for (int i = folder.Items.Count; i > 0; i--)
                    {
                        itemsProcessedCount++;

                        if (itemsProcessedCount%100 == 0)
                        {
                            Console.WriteLine("\nNo Of Items Processed: {0}", itemsProcessedCount);
                        }

                        var a = folder.Items[i]; // Randomly getting exception here

                        if (!(a is OutLook._MailItem))
                        {
                            continue;
                        }

                        var mailItem = a as OutLook._MailItem;
                        // do the processing and move the item.
                        mailItem.Move(processedFolder);
                    }

我正在尝试使用Microsoft.Office.Interop.Outlook;来处理来自pst的邮件项目。在处理项目时,应用程序随机抛出异常 var a = folder.Items [i];

  

发生了System.Runtime.InteropServices.COMException   HResult = -2147219437消息=操作失败。消息传递   接口返回了未知错误。如果问题仍然存在,   重启Outlook。 Source = Microsoft Outlook ErrorCode = -2147219437
  堆栈跟踪:          在Microsoft.Office.Interop.Outlook._Items.get_Item(对象索引)

我似乎在添加睡眠时间之后解决了这个问题。Thread.Sleep(3000); var a = folder.Items[i]; // Randomly getting exception here但是应用程序再次崩溃并出现相同的错误。

有人有解决方案吗?迫切需要帮助。 感谢。

1 个答案:

答案 0 :(得分:0)

这可能是竞争条件。

mailItem.Move(processedFolder)可能导致文件夹项列表的异步更新,这与您读取项目的代码发生冲突。睡眠可能会在您阅读其他项目之前完成移动代码的时间。

您最好的选择是在开始移动循环之前将文件夹中的所有项目.Items变量放入您自己的列表中。然后遍历您的列表,逐个移动所有项目。

我不完全是你的interop中暴露的接口,但可能是这样的:

var list = folder.Items.Where(i => i is OutLook._MailItem)
                       .Cast<OutLook._MailItem>()
                       .ToList();

foreach (var item in list)
{
     // your mail-moving code here                
}