제 생각에는 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됩니다. (적어도 이것은 내가 관찰 한 동작입니다.)
은 UI 반응 동안을 유지하기 위해 루프 내부 Application.DoEvents()를 호출하는 것은 좋은 생각이 이제까지 그것을인가
말했다, 동일한 UI 스레드 내에서 더 많은 작업을 수행하기 전에 비동기 작업이 완료되기를 기다리는 중입니까?
루프 내에서 Application.DoEvents()를 호출하는 것이 좋지 않은 경우에도 catch 절에서 PerformAsyncOperation()에 의해 throw 된 예외를 처리 한 후 응용 프로그램이 조용히 종료됩니다 (오류가없는 창이 멈추지 않음) ?
을,이 캐치 아무것도 잡지 못할 것이다. 디버거를 사용하는지 여부와 Application.SetUnhandledExceptionMode() 값이 중요한지 여부. 발을 어떻게 날려 버렸는지는 불분명하지만 DoEvents를 사용할 때 분명히 일반적인 결과입니다. 세부 사항 [여기 있습니다.] (http://stackoverflow.com/questions/5181777/use-of-application-doevents/5183623#5183623) –