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
但是应用程序再次崩溃并出现相同的错误。
有人有解决方案吗?迫切需要帮助。 感谢。
答案 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
}