C#Outlook加载项随机停止工作,没有错误

C#Outlook加载项随机停止工作,没有错误,c#,outlook,add-in,C#,Outlook,Add In,我为Outlook编写了一个小插件,它监视接收到的电子邮件,然后自动打印附件(如果有),如果没有附件,则打印电子邮件本身 起初,我有一些问题,如果是在处理电子邮件的过程中,另一封邮件进来,它会跳过它,所以很多电子邮件没有打印出来。我尝试了多线程应用程序,但Outlook在那之后拒绝打开,不断给出一些随机错误。因此,最后我更改了加载项,使其只将附件或电子邮件保存到队列(硬盘上的文件夹),然后控制台应用程序通过该队列打印电子邮件/附件 这一切在一段时间内都非常有效,但Outlook只是停止向应用程序

我为Outlook编写了一个小插件,它监视接收到的电子邮件,然后自动打印附件(如果有),如果没有附件,则打印电子邮件本身

起初,我有一些问题,如果是在处理电子邮件的过程中,另一封邮件进来,它会跳过它,所以很多电子邮件没有打印出来。我尝试了多线程应用程序,但Outlook在那之后拒绝打开,不断给出一些随机错误。因此,最后我更改了加载项,使其只将附件或电子邮件保存到队列(硬盘上的文件夹),然后控制台应用程序通过该队列打印电子邮件/附件

这一切在一段时间内都非常有效,但Outlook只是停止向应用程序报告新电子邮件,并且不会在任何地方记录任何错误。重新启动Outlook会让它重新工作,直到一段随机时间(有时是几个小时,有时是一天)之后它再次停止。它变得相当烦人,因为插件的目的是减少销售人员打印订单的时间,但这个问题意味着他们必须根据收到的电子邮件检查打印件,以确定哪些已经打印或没有打印。我现在做了一个改变,它会在打印邮件时自动标记为已读邮件,这样他们就可以看到邮件何时停止,但它仍然不完美

有人知道Outlook突然停止向此加载项报告新电子邮件的原因吗?收到新电子邮件时运行(或应运行)的代码为:

        void outlookApp_NewMailEx(string EntryIDCollection)
    {
        try
        {
            WriteToLog("Email Received: " + ((Outlook.MailItem)Application.Session.GetItemFromID((string)EntryIDCollection)).Subject);
            ProcessEmail(EntryIDCollection);
        }
        catch (System.Exception ex)
        {
            WriteToLog("Error: " + ex.Message);
        }
    }
它甚至不记录“Email Received”,也不记录catch块中的错误,所以我认为事件甚至没有被触发。这并不是因为在最后一站之前打印的最后一封电子邮件是19个小时内收到的唯一一封邮件(那是周六晚上),所以它似乎已经超载了

任何建议都将不胜感激——我感到很麻烦,因为最初我花了15-30分钟写的东西现在却花了好几天的时间来克服各种各样的微软ISSE

编辑:

以下是WriteToLog方法。我刚刚意识到,问题可能是访问日志文件,因为加载项和控制台应用程序都使用同一个文件,因此可能试图同时写入日志文件

    private void WriteToLog(string message)
    {
        using (StreamWriter sw = File.AppendText(logFile))
        {
            sw.WriteLine(DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + ": " + message);
        }   
    }
我现在将对此进行研究,并可能为console应用程序创建第二个日志文件

编辑2:

以下是我在“ThisAddin_Startup”方法中订阅事件的方式:


ProcessEmail
中有什么内容?它基本上会将附件保存到磁盘,或者如果没有附件,则会将电子邮件正文保存到.txt或.html文件(取决于是否为html电子邮件)。我可以在这里发布代码,但事实上它甚至没有写入日志,即在调用的前一行收到了电子邮件,这表明它没有调用该方法。当它停止工作时,是outlook禁用了加载项,还是您的加载项刚刚停止工作?它似乎仍然处于启用状态,因此,Outlook似乎刚刚停止向加载项报告新电子邮件。然而,我刚刚在我的原始帖子中使用WriteToLog方法进行了更新-可能是外接程序和控制台应用程序都试图同时向其写入。您是如何以及何时订阅这些事件的?
ApplicationClass outlookApp = new ApplicationClass();

        outlookApp.NewMailEx += new ApplicationEvents_11_NewMailExEventHandler(outlookApp_NewMailEx);