2012-07-19 65 views
0

我正在使用II6。我有一個方法(LogMessageToSIFDB),我假設有一個例外,IIS black-holing Task.Factory.Start新例外

Task.Factory.StartNew(() => LogMessageToSIFDB(inClientID, tmpByte, Modified, SIF_MessageID, SIF_TimeStamp)); 

的方法很簡單

  1. 連接到DB
  2. 調用存儲過程
  3. 關閉連接

數據庫連接現在可以正常工作。我遇到的問題是如果發生異常,任何地方都沒有記錄。

如果我改變了邏輯流,存儲過程的不會被調用,並沒有被記錄到事件或任何

  1. 拋出新ApplicationException的(「從LogMessageToSIFDB()你好」);
  2. 連接到DB
  3. 調用存儲過程
  4. 關閉連接

簡單地說,這並不做任何事情,使得到的東西記錄。

Task.Factory.StartNew(() => { throw new ApplicationException("Hello from LogMessageToSIFDB()"); }); 

這裏是我想要做的事。我在一個實現了Engineering給我的接口的DLL中有這個代碼。它們傳入一個XML消息流。我需要修改該消息。我還需要記錄原始信息。

將消息記錄到數據庫只會導致IIS線程阻塞更長時間,所以我想我只是創建一個任務並讓它運行異步。如果電話偶爾不能工作,我真的不在意,但如果我正在調試當前的問題,我需要看到一條錯誤消息。

我希望任務中的未處理異常只會在事件日誌中出現,但我什麼都看不到。

異步日誌記錄不是必需的,但它是首選。最壞的情況就是刪除任務並讓它同步運行。

+0

您是如何使用IIS的?通過ASP.NET? – svick 2012-07-19 20:51:44

+0

是的,ASP.NET。除了任何定製服務器的調整之外,這是相當普通的。 – Bengie 2012-07-19 21:22:51

+0

通常,一個不合常規的異常會殺死您的進程。你不應該讓ASP.NET工作者發生這種情況,因爲併發請求會被粗暴地中止。 – usr 2012-07-19 21:53:30

回答

1

隨着Task秒,期望的是,你要觀察Task莫名其妙的異常:通過訪問其Exception財產使用Wait()Result(其拋出異常,封閉在一個AggregateException),或直接。

如果你不這樣做,並且Task得到垃圾回收,它的終結器會拋出異常,這將導致整個過程停止(儘管.Net 4.5改變了這一點,終結器將不再拋出)。但是你必須記住,GC不是確定性的,並且只有在很長一段時間後才能收集,這很可能是你沒有看到任何東西的原因。

你應該做的是以某種方式觀察異常。如果您想異步執行此操作,則可以使用ContinueWith()以及OnlyOnFaulted。但更簡單的方法是使用正常的try - catch

Task.Factory.StartNew(() => 
{ 
    try 
    { 
     LogMessageToSIFDB(inClientID, tmpByte, Modified, SIF_MessageID, SIF_TimeStamp)); 
    } 
    catch (Exception ex) 
    { 
     // perform your logging here 
    } 
}); 
+0

謝謝,這有助於我理解背後的邏輯:-) – Bengie 2012-07-23 19:32:51