螺纹控制台应用程序抛出错误,但执行正常,没有任何记录

时间:2011-05-17 06:08:04

标签: c# .net

我有一个小型控制台应用程序,它具有从数据服务器收集实时数据并将其丢入数据库的相当简单的任务。该应用程序与服务器建立TCP连接,然后服务器保持连接打开并将数据向下输送到管道。应用程序收集它,重新格式化它,然后将其放入MSSQL数据库中。

应用程序是多线程的 - 在启动时,我启动了一个“收集器”线程,该线程负责管理与数据源的TCP连接并将数据消息投入内部队列。有一个单独的“处理器”线程,它在队列中查找消息,单独拉出它们并创建数据库插入事务。一旦其他线程启动并运行,初始启动线程几乎不执行任何操作。

使用NLog进行相当广泛的记录,包括文件和控制台。

我遇到的问题是,有时,Windows(Server 2008)会抛出类似(但显然不一样!)的错误对话框,如下所示。发生这种情况时,控制台日志记录暂停,以便我可以看到引发错误的大致时间。如果我单击“关闭程序”,应用程序将继续正常运行,但消息队列的大小会快速上升,就好像收集器线程一直在运行但处理器线程已被阻止。日志中没有记录任何抛出的异常。

http://img833.imageshack.us/img833/7533/pleaseclosethisprogram.png

鉴于我认为我抓住了尽可能多的例外并尽可能地记录,我对这可能是什么感到难过。我原本以为它可能是抛出异常的日志记录机制,但是在翻录出log4net并用Nlog替换之后,我看到了同样的行为。这是非常难以复制的,因为它只是不规律地发生,大约每周两次。该应用程序是用C#.NET 4编写的。

如果有人对我可以采取的解决这个问题的步骤有任何想法,那将非常感激。

修改

好的,我从事件日志中得到了一些细节,我完全忘记了.NET异常也会被记录在那里。这是数据:

Faulting application name: DataArchiver.exe, version: 1.0.0.0, time stamp: 0x4dd027df
Faulting module name: unknown, version: 0.0.0.0, time stamp: 0x00000000
Exception code: 0x00000000
Fault offset: 0x0039b8f0
Faulting process id: 0x59c
Faulting application start time: 0x01cc13358473b6da
Faulting application path: D:\DataArchiver\DataArchiver.exe
Faulting module path: unknown
Report Id: f352ef11-7ffc-11e0-9cd0-005056bc0006

1 个答案:

答案 0 :(得分:1)

首先,您可以通过将整个Main方法包装在try / catch块中来确保捕获应用程序中任何未处理的异常。另外,为AppDomain.CurrentDomain.UnhandledException事件添加事件处理程序。这将捕获您的后台线程抛出的事件。两个处理程序都应记录错误,然后允许应用程序关闭。

如果您的线程在后台运行,并且其IsBackground属性未设置为true,则会使您的应用程序保持活动状态。您的主程序逻辑还应该注意通知所有线程,如果发生异常,用户关闭请求或窗口关闭,它们应该完成。