FtpRequest를 이용한 FTP 클라이언트를 만드는 도중, 폼이 종료 할때 종료가 지연되는 문제가 발생했다.

원인을 파악해 보니 접속되지 않는 주소에 연결을 하게 될 경우나 파일 전송중에 종료를 하게 되니 발생하는 문제였다.

Thread의 Abort 기능이나 interrupt 로 처리해 보았지만, 여전히 문제는 해결되지 않았다. 그러던중 IsBackground라는 속성을 알게 되었는데 이 IsBackground에 대한 설명은 msdn에 다음과 같이 설명되어 있다.

http://msdn.microsoft.com/ko-kr/library/system.threading.thread.isbackground.aspx

스레드가 배경 스레드인지 여부를 나타내는 값을 가져오거나 설정합니다.

네임스페이스: System.Threading
어셈블리: mscorlib(mscorlib.dll)

public bool IsBackground { get; set; }
속성 값
형식: System.Boolean

이 스레드가 백그라운드 스레드이거나 백그라운드 스레드가 될 예정이면 true이고, 그렇지 않으면 false입니다.

배경 스레드는 프로세스의 종료를 막지 않는다는 점을 제외하고 전경 스레드와 동일합니다. 프로세스에 속해 있는 모든 전경 스레드가 중단되면 공용 언어 런타임에서 프로세스를 끝냅니다. 나머지 배경 스레드는 모두 중지되며 완료되지 않습니다.

Thread WorkThread = new Thread(new ThreadStart(WorkProc));
WorkThread.IsBackgound = true;

위와 같이 처리하면 종료 시 지연 되는 문제는 없어진다. Foreground 쓰레드는 생성된 후 자신의 작업이 끝날때 까지 종료되지 않는다. 그래서 메인 쓰레드가 종료되더라도 쓰레드가 종료 될 때까지 대기 상태로 머무르게 된다. Background는 주 쓰레드를 대신하여 작업을 대신 하는 것이므로 진입 메소드가 종료되면 쓰레드가 끝나는 것으로 자연스럽게 표현된다고 한다.

Thread의 abort는 기존 TherminateThread 와 같은 기능은 아닌것 같고 ThreadAbortException을 발생 시킨다고 한다. 또한 intterupt는 ThreadInterruptedException을 발생시킨다.

'프로그래밍 > C#' 카테고리의 다른 글

PNG 16bit grayscale 데이터 읽기  (0) 2022.03.15
Window class name is not valid  (0) 2014.08.06
C# array char to String 변환  (0) 2013.08.14
변수 타입  (0) 2013.08.14

+ Recent posts