2011-05-17 44 views
1

我有一個小的控制檯應用程序,它有一個相當簡單的任務,即從數據服務器收集實時數據並將其投入數據庫。該應用程序與服務器進行TCP連接,然後將連接保持打開狀態,並將數據放入管道中。該應用程序收集它,重新格式化,然後將其夾在MSSQL數據庫中。線程控制檯應用程序拋出錯誤,但執行正常進行,沒有任何記錄

該應用程序是多線程的 - 在啓動時,我啓動一個'收集器'線程負責管理與數據源的TCP連接並將數據消息引發到內部隊列中。有一個單獨的「處理器」線程,用於查找隊列中的消息,逐個關閉它們並創建數據庫插入事務。一旦其他線程啓動並運行,初始啓動線程幾乎不做任何事情。

一切都使用NLog進行相當廣泛的記錄,無論是文件還是控制檯。

我遇到的問題是有時Windows(Server 2008)會拋出一個與下面類似的錯誤對話框(但顯然不是相同的!)。發生這種情況時,控制檯日誌記錄會暫停,以便我可以看到錯誤引發的大致時間。如果點擊「關閉程序」,應用程序將繼續正常運行,但消息隊列的大小會迅速增加,就好像收集器線程一直在運行,但處理器線程已被阻止。日誌中沒有記錄任何拋出的異常。

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

考慮,我認爲我趕上儘可能多的異常可能和儘可能的記錄,我難倒什麼,這可能是。我原本以爲它可能是引發異常的日誌記錄機制,但是在將log4net取出並用Nlog替換之後,我看到了相同的行爲。鑑於它只是不規則地發生,這是非常難以複製的,大約每週兩次。該應用程序是用C#.NET 4.0編寫的。

如果任何人有任何關於我可以採取的步驟來解決此問題的想法,那將非常感激。

編輯

好吧,我已經得到了從事件日誌中的一些細節,我已經完全忘記了.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 
+0

聽起來像是一個僵局。你的隊列如何實現? – 2011-05-17 06:19:44

+0

您是否在事件查看器(控制面板,管理工具)中找到任何內容? – Groo 2011-05-17 06:19:56

+0

聽起來像一個StackOverflow錯誤,您的操作系統正在關閉您的應用程序。檢查事件查看器以確認。 – 2011-05-17 06:29:55

回答

1

對於開始,你可以確保你通過包裝在一個try/catch塊整個Main方法趕在你的應用程序的任何未處理的異常。另外,爲AppDomain.CurrentDomain.UnhandledException事件添加事件處理程序。這將捕獲您的後臺線程拋出的事件。這兩個處理程序都應記錄錯誤,然後允許應用程序關閉。

如果您有一個線程在後臺運行,並且其IsBackground屬性未設置爲true,它將使您的應用程序保持活動狀態。您的主程序邏輯還應該注意通知所有線程,以防萬一發生異常,用戶關閉請求或Windows關閉。

+0

圍繞'Main()'方法的try/catch是否會捕獲由該方法啓動的子線程中拋出的異常?我會看看將這些東西添加到代碼庫中,看看它們是否有所作爲。理想情況下,我希望這個應用程序保持儘可能多的運行狀態,只有在發生極其致命的錯誤時才能繼續運行。 – growse 2011-05-17 06:43:06

+0

@growse:不,不同線程上的異常不會被捕獲,但這就是'AppDomain.CurrentDomain.UnhandledException'的用處。但是,自由吞嚥例外也不是一個答案。你不想讓你的應用程序安靜地運行,沒有錯誤,只是發現它實際上並沒有將一個實體插入數據庫超過一個星期。請記住,很難預測哪個未處理的異常(未處理,但最終被捕獲到頂部)會使程序處於「足夠有效」的狀態以繼續前進。 – Groo 2011-05-17 07:02:06

+0

這是一個很好的觀點 - 我需要配合一些合理的警報機制讓我知道有一個問題。但是,我不希望應用程序因爲數據庫決定關閉10分鐘而丟失數據。我寧願讓程序對消息進行排隊,直到它達到預先定義的隊列大小(即,在內存用完之前),然後如果問題在此之後仍未解決,則可以退出。但是,理解異常處理並不是微不足道的。 – growse 2011-05-17 07:05:38

相關問題