2013-03-21 1 views
0

제 생각에는 UI 스레드가 예외를 throw하고 사용자 코드에 의해 처리되지 않는 경우 Windows Forms 응용 프로그램에서 응용 프로그램이 사용자에게 명백한 방식으로 충돌합니다.UI 스레드에 의해 올바르게 처리되는 예외로 인해 Windows Form 응용 프로그램이 자동으로 종료 될 때 어떤 의미입니까?

는 윈도우 형태가 가지고있는
try 
{ 
    PerformAsyncOperation(); 
    while(!async_op_complete) 
    { 
      Application.DoEvents(); 
    } 
} 
catch 
{ 
    Print("exception"); 
} 

내 undestanding가 있기 때문에 :

이제 다음 코드를 고려 (A 메시지가 화면 응용 프로그램이 충돌 것을 나타내는에 나타납니다, 또는 창을 동결, 또는 둘 다) 동기화 컨텍스트, 비동기 작업 (그리고 나는 .net 4.5에 대해 이야기하지 않습니다.)은 컨트롤이 이벤트 처리기 프로 시저를 벗어날 때까지 수행되지 않습니다. 이렇게되면 비동기 코드가 UI 스레드 내에서 실행됩니다. 해당 코드가 예외를 throw하는 경우 async 메서드 호출을 둘러싼 try-catch 문에 의해 catch되지 않습니다. 예외가 throw 될 때까지 컨트롤에서 try-catch 문을 이미 두었 기 때문입니다.

위와 같은 경우 우리가 루핑한다는 사실은 컨트롤이 UI 스레드 안에 남아 있다는 것을 의미하며 루프 내부에서 Application.DoEvents()를 호출한다는 사실은 비동기 작업이 수행된다는 것을 의미합니다 UI 스레드 내에서 "비동기 적으로". 그리고 그 루프가 try 절 내에서 발생하기 때문에 async 메서드에 의해 던져진 예외는 해당 catch 절에 의해 catch됩니다. (적어도 이것은 내가 관찰 한 동작입니다.)

  1. 은 UI 반응 동안을 유지하기 위해 루프 내부 Application.DoEvents()를 호출하는 것은 좋은 생각이 이제까지 그것을인가

    말했다

    , 동일한 UI 스레드 내에서 더 많은 작업을 수행하기 전에 비동기 작업이 완료되기를 기다리는 중입니까?

  2. 루프 내에서 Application.DoEvents()를 호출하는 것이 좋지 않은 경우에도 catch 절에서 PerformAsyncOperation()에 의해 throw 된 예외를 처리 한 후 응용 프로그램이 조용히 종료됩니다 (오류가없는 창이 멈추지 않음) ?

+0

을,이 캐치 아무것도 잡지 못할 것이다. 디버거를 사용하는지 여부와 Application.SetUnhandledExceptionMode() 값이 중요한지 여부. 발을 어떻게 날려 버렸는지는 불분명하지만 DoEvents를 사용할 때 분명히 일반적인 결과입니다. 세부 사항 [여기 있습니다.] (http://stackoverflow.com/questions/5181777/use-of-application-doevents/5183623#5183623) –

답변

1

1) 내부에 더 많은 일을로 이동하기 전에 완료 비동기 작업을 기다리는 동안 반응 UI를 유지하기 위해 루프 내부 Application.DoEvents()를 호출하는 것은 좋은 생각이 있나이다 동일한 UI 스레드?

절대적으로! DoEvents()은 악의이며 모든 종류의 문제가 발생할 것입니다. 그 이유는 응용 프로그램이 조용히 (더 윈도우 동결을 종료하지 않는 루프 내에서 Application.DoEvents()를 호출하는 것은 좋은 생각이 아니다하더라도

2), 캐치 절 후 오류 메시지)에 의해 던져진 예외를 처리하지 PerformAsyncOperation()?

PerformAsyncOperation()을 알지 못해서 말하기 어렵습니다. 명시 적으로 새로운 Thread (또는 Task)을 사용하지 않으면 루프 이전에 동 기적으로 실행됩니다.

앱 종료에 대해서는 설명 할 수 없습니다.

직원 Thread에 캐치되지 않는 예외가 발생하면 앱에 "작업 중지됨"대화 상자가 표시되고 종료됩니다.

내가 변경된 유일한 점은 잡히지 않은 예외가 Task에서 발생했을 때의 동작입니다. .NET 4.5 이전에는 Thread처럼 빠름이 발생했습니다.

.NET 4.5를 설치 한 경우 (응용 프로그램 4.0을 대상으로하는 경우) Task에있는 캐치되지 않는 예외가 자동으로 삼켰습니다.

가 여기에 행동을 설명하는 글이다 : 기본적으로 MSDN: Task Exception Handling in .NET 4.5