본문 바로가기
ASP.NET4

스레드가 중단되었습니다. System.Threading.ThreadAbortException

by Jundol 2020. 9. 1.


 

Logout 시 aspx.cs 코드의 Response.Redirect 에서 문제가 발생.


일반적인 Response.Reidrect(String) 을 사용했을 때는 Response.Redirect(String, Boolean) 메소드의 두 번째 매개변수를 true 로 설정하여 호출하는것과 동일한 효과를 낸다.

Response.Redirect(String) 호출 완료 시 HttpResponse.End 메소드를 호출하게되는데 이 메소드는 ThreadAbortException 에 대한 예외를 발생시킬 수 있다.

HttpResponse.End 메소드는 현재 버퍼링된 모든 출력을 클라이언트로 보내고 페이지 실행을 중지하고 EndRequest 이벤트를 발생시킨다.

이 메소드는ASP.NET 1.0 에서 추가되었는데 classic ASP와의 호환성을 위해서만 제공되는데 COM기반 웹 프로그래밍 기술과의 호환성을 위해 제공된다. (COM 기반 웹 프로그래밍은 ASP.NET 이전의 기술이다.)

classic ASP에서는 이 메소드가 스크립트 처리를 종료했는데 ASP.NET에서는 이 호출에 따르는 스크립트 종료 라인이 실행되지 않는다.

그래서 .NET에서 End 메소드의 동작을 모방하기 위해 ThreadAbortException 예외를 발생시키려한다. 

ThreadAbortException 은 굉장히 터무니없게 비싼 동작이다.

그러므로 HttpResponse.End 메소드는 피해야만 한다.


Redirect 후에 코드 라인이 실행되지 않기를 바란다면 HttpApplication.CompleteReqeust() 를 호출하면된다.


앞으로 Response.Redirect 메소드를 사용할 때에는 두 번째 인자에 false 를 넣어 사용하도록 한다.


참고

Correct use of System.Web.HttpResponse.Redirect - https://docs.microsoft.com/ko-kr/archive/blogs/tmarq/correct-use-of-system-web-httpresponse-redirect

HttpResponse.Redirect Method - https://docs.microsoft.com/en-us/dotnet/api/system.web.httpresponse.redirect?view=netframework-4.8



댓글