2013-12-18 55 views
1

我有一個使用產生了許多的工作線程執行某些任務,如C#多線程控制檯運行時錯誤

  1. 通過SNMP從我們內網多臺服務器讀取OS數據一parallel.foreach一個控制檯應用程序和
  2. 將這些值寫入SQL服務器數據庫。

當我在調試或發佈模式下運行Visual Studio 2010中的代碼時,程序無例外地執行。當我部署程序並在VS之外運行時,我得到一個異常(.NET Runtime Exceptiopn)。

堆棧跟蹤:

應用:ServerMonitorSNMP.exe Framework版本:v4.0.30319說明:該過程由於未處理的異常終止。異常信息:System.AggregateException堆棧:在System.Threading.Tasks.Parallel.ForWorker [[System .__ Canon,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]](Int32,Int32,System.Threading。 Tasks.ParallelOptions,System.Action`1,

...

在ServerMonitoringSNMP.Program.Main(System.String [])

的AggregateException細節爲:

System.UnhandledExceptionEventArgs System.AggregateException:發生一個或多個錯誤。 ---> System.InvalidOperationException:超時過期。在從池中獲取連接之前已超時。發生這種情況的原因可能是因爲所有連接池都在使用中,並且達到最大池大小。

...

(內部異常#0)System.InvalidOperationException:超時過期。在從池中獲取連接之前已超時。發生這種情況的原因可能是因爲所有連接池都在使用中,並且達到最大池大小。

...

(內部異常#1)System.InvalidOperationException:超時過期。在從池中獲取連接之前已超時。發生這種情況的原因可能是因爲所有連接池都在使用中,並且達到最大池大小。

...

(內部異常#2)System.InvalidOperationException:超時過期。在從池中獲取連接之前已超時。發生這種情況的原因可能是因爲所有連接池都在使用中,並且達到最大池大小。

...

System.AggregateException:發生了一個或多個錯誤。 ---> System.NullReferenceException:未將對象引用設置爲對象的實例。 \ Program中的ServerMonitoringSNMP.Program.GetStorageValue(Dictionary`2 StorageQuery,Int32 diskOidIndex)中的 。cs:line 896

+0

捕獲異常並記錄它的地方,看看有什麼地方錯了? – nvoigt

回答

2

這是一個未處理的aggregate exception。您將需要捕獲這種類型的錯誤,循環遍歷它的異常並記錄每一個錯誤以確定發生了什麼。

您可能沒有打破調試例程中的這些類型的異常。

開啓中斷全部異常(調試,異常)或(CTRL + ALT +Ë),並重新運行該程序。
這會向您顯示最初拋出的異常。

捕捉代碼:

catch (AggregateException e) 
{ 
    foreach (var ex in e.InnerExceptions) 
    { 
     //log here 
    } 
} 
+0

謝謝,我剛剛嘗試,但現在我沒有得到任何例外。似乎它們隨機出現?我明天再試一次。 – peer754

+0

@ peer754只需將您的異常處理和日誌記錄到位,然後在出現時就可以找到它。如果它似乎隨機出現,您可能會遇到競爭狀況。 – paqogomez

+0

嗨,我終於設法捕捉一些錯誤,太多的行以適應這個評論,所以我會張貼它作爲一個答案,而不是,希望沒關係? 在這篇文章中,似乎我有兩種處理異常的: 1)超時 2)Nullreference – peer754

2

所附的例外是過於抽象。最好的方法是處理TPL異常和日誌。當你這樣做時,事情會更清楚。然後,您可以通過適當的例外更新帖子。

如:

 try 
     { 
      YourSNMPTrapSenderMethod(); 
     } 
     catch (AggregateException ae) 
     { 
      // This is where you can choose which exceptions to handle. 
      foreach (var ex in ae.InnerExceptions) 
      { 
       // log your exception. may be in temp directory 
      } 
     } 

或者

 try 
     { 
      YourSNMPTrapSenderMethod(); 
     } 
     catch (AggregateException ex) 
     { 
      ex.Handle((x) => 
      { 
       Log.Write(x); 
       return true; 
      }); 
     } 


    static void YourSNMPTrapSenderMethod() 
    { 
     var exceptions = new ConcurrentQueue<Exception>(); 
     Parallel.ForEach(data, d => 
     { 
      try 
      { 
       //do your operations 
      } 

      catch (Exception e) { exceptions.Enqueue(e); } 
     }); 


     if (exceptions.Count > 0) throw new AggregateException(exceptions); 
    } 
+0

明天我會先試一試你的建議,謝謝! :) – peer754

相關問題