2013-12-18 1 views
1

나는 그런 우리의 인트라넷에서 다수의 서버에서 SNMP를 통해 OS의 데이터를 읽는C# 멀티 스레딩 콘솔 런타임 오류

  1. 같은 일부 작업을 수행하는 작업 스레드의 수를 생산하는 parallel.foreach를 사용하는 콘솔 응용 프로그램을
  2. 은이 값을 SQL 서버 DB에 기록합니다.

Visual Studio 2010 내에서 디버그 모드 또는 릴리스 모드로 코드를 실행하면 프로그램이 예외없이 실행됩니다. 프로그램을 배포하고 VS 외부에서 실행하면 예외가 발생합니다 (.NET 런타임 Exceptiopn).

스택 추적 :

응용 프로그램 : ServerMonitorSNMP.exe 프레임 워크 버전 : v4.0.30319 설명 : 프로세스가 처리되지 않은 예외로 인해 종료되었습니다. 예외 정보 : System.AggregateException 스택 : System.Threading.Tasks.Parallel.ForWorker [System .__ Canon, mscorlib, 버전 = 4.0.0.0, Culture = 중립, 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 (Dictionary2 StorageQuery, Int32 diskOidIndex)의 .cs : line 896

+0

캐치를 제외하고 무엇이 잘못되었는지 볼 어딘가를 기록? – nvoigt

답변

2

처리되지 않은 aggregate exception입니다. 이러한 유형의 오류를 잡아 예외를 반복하고 각각을 기록하여 무슨 일이 일어나는지 파악해야합니다.

디버그 루틴에서 이러한 유형의 예외가 발생하지 않았을 수 있습니다. 모든 예외 (디버그, 예외) 또는 (CTRL + ALT + E) 프로그램을 다시 실행에 브레이크에

켭니다.
첫 번째 장소에서 던져 졌을 때 원래 예외가 표시됩니다.

캐치 코드 :

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