2014-07-09 11 views
1

함수 내부에서 두 개의 태스크가 필요하며 각 예외를 처리하기 위해 Try Catch가 있습니다. 하지만 나는 첫 번째 작업에서 예외가 있고 두 번째 예외에서 Exception으로 끝나는 경우 함수에서 돌아 오는 경우 어떤 일이 발생하는지 알고 싶습니다. 두 번째 작업의 예외가 처리되지 않고 GC로 해당 작업 개체에 대해 Finalize가 호출 될 때 응용 프로그램이 중단됩니다.작업에서 예외가 발생했습니다.

샘플 코드 : 당신이 당신이 언급 한 TPL 처리되지 않은 오류 동작을 호출합니다 작업 2의 잠재적 인 예외를 관찰하기 전에 기능을두면

public void ProcessJob() 
    { 
     var Job1 = Task.Factory.StartNew(() => Dojob1()); 
     var Job2 = Task.Factory.StartNew(() => Dojob2()); 

     try 
     { 
      Job1.Wait(); 
     } 
     catch(Exception ex) 
     { 
      //Handle Exception 
      return; 
     } 

     //some other actions. 


     try 
     { 
      Job2.Wait(); 
     } 
     catch(Exception ex) 
     { 
      //Handle Exception 
      return; 
     } 
    } 
+1

어쨌든 작업이 완료 될 때까지 동 기적으로 대기하는 경우 작업을 처음 사용하는 이유는 무엇입니까? Dojob1()과 Dojob2()를 직접 호출하는 것이 어떨까요? 일반적으로 오류를 처리하기 위해 작업에 연속을 추가하고 해당 연속 내에서 작업의 상태 (throw 된 예외 포함)를 검사 할 수 있습니다. 그건 비동기식 설정을위한 것이지 실제로 사용하지는 않습니다. – David

+0

작업에서 처리되지 않은 예외가 더 이상 응용 프로그램을 끊지 않습니다 (.Net 4.5 이후) – i3arnon

+0

@David. 답장을 보내 주셔서 감사합니다. 위의 코드는 원래 문제의 개요입니다. 위 코드의 결과를 알고 싶습니다. –

답변

2

. 왜 그럴까? 귀하의 코드가 가지고있는 구조는 TPL에 알려지지 않았습니다. TPL은 당신이 당신의 방법을 어떻게 쓰는지에 따라 그 행동을 마술처럼 바꿀 수 없다.

.NET 4.5 처리되지 않은 예외로 시작하면 더 이상 프로세스가 중단되지 않습니다. 여전히 그들을 무시하지 마십시오. 예외는 버그를 나타낼 수 있습니다.

아마도 Parallel.Invoke 또는 Task.WaitAll을 사용하여 코드를 단순화 할 수 있습니다. 물론 Job1이 실패한 경우에도 모든 작업이 완료 될 때까지 메소드의 리턴이 지연됩니다.

Job2로 인한 예외를 무시할 수 있지만 오류를 무시하는 것은 좋은 방법은 아닙니다. 최소한 그들은 기록되어야합니다.

+0

입력에 감사드립니다. –

관련 문제