我正在编写一个小型的wpf应用程序,它将通过C#outlook集成从用户展望中读取前50个电子邮件(只是电子邮件没有其他项目)。
要使我的应用程序UI响应,我正在建立MAPI连接并从后台工作程序读取收件箱文件夹。
一切正常,但对于一些用户来说,我正在跟踪异常。
The operation failed.
at Microsoft.Office.Interop.Outlook._MailItem.get_SenderName()
at WPFapplication.WPFOutlookView.OutlookMailItem..ctor(MailItem item)
at WPFapplication.WPFOutlookView._getEmailsBackgroundWorker_DoWork
(Object sender, DoWorkEventArgs e)
此异常非常随机发生,我无法在我的开发计算机上重现它。
我可以使用后台工作程序从WPF应用程序建立Outlook连接吗? (因为一些在线帖子暗示所有Outlook OOM调用必须在outlook主线程中发生。是 即使我们正在编写outlook addin,它也适用吗?)
如果是这样,当某些用户计算机没有设置任何Outlook配置文件或等待用户输入密码时,如何使我的应用程序响应?
更新: 我不是试图在无人看管的情况下检索电子邮件,只是我需要的是不管用户输入我的应用程序需要加载其UI,它可以等待用户输入凭证时检索电子邮件。如果我在UI线程中调用OOM,那么在用户输入凭据之前,我的应用程序的整个UI都不会呈现,这是在后台工作程序中调用OOM的主要原因。我的应用程序很简单1.一个wpf视图和一个列表框,当用户收到新的电子邮件时,它会显示前20个电子邮件和更新。我的实现在我的WPF视图中有一个后台工作者调用OOM并获取电子邮件并更新列表,此列表绑定到列表框。你在这里建议改变什么?
答案 0 :(得分:0)
为了获得更好的观点,请告诉我们确切的例外......
您的问题的答案:
1)是的,它适用。 OOM是一名STA。
2)我不明白这一点。让我试着回答你更多,如果希望这个应用程序在没有outlook的情况下运行,我怀疑 - 为了执行OOM代码,请确保在机器中安装outlook。此外,OOM不适合在无人参与模式下工作(没有Outlook配置文件设置/等待用户输入密码)。这是OOM的设计限制。
希望这有帮助。
答案 1 :(得分:0)
我找到了解决此问题的方法,它与线程或后台工作无关。 Actuall问题是用户有2台机器设置具有相同的外观轮廓,并且在同步中存在一些时滞。由于这个,当我试图阅读文件夹的电子邮件和用户从不同的机器删除相同的电子邮件我得到“操作失败”异常。解决方案是我在阅读电子邮件属性时处理com异常并继续进行其余的电子邮件处理。 谢谢你的帮助。