BackgroundWorker가 소리없이 죽어버리는 경우
분명 BackgroundWorker.WorkerSupportsCancellation 속성을 True로 해놓았고, DoWork 핸들러에 BackgroundWorker.CancellationPending이 true일 경우가 아니면 무한 루프를 돌게 해놓았는데 자꾸 루프를 빠져나가는 어떤 신호도 없이 Worker가 죽어버려서 이유를 찾던 중 어이없는 실수를 깨달았습니다.
DoWork 이벤트 핸들러 내부 루프에서 소켓 컬렉션을 가지고 foreach 루프를 한 번 도는데, Disconnected된 Socket을 찾고 해당 Socket을 컬렉션에서 제거하는 작업을 하는 중 접속 해제된 소켓이 감지됐을 경우 Close하는 메서드의 catch문과 DoWorkEventHandler 내부의 catch문이 중복되는 것을 발견했습니다. (ObjectDisposedException)
즉, DoWorkEventHandler의 try 문 안에서 ObjectDisposedException이 발생하는데, 이 때 DoWorkEventHandler 내부의 catch문에서 일단 잡힌 후 빠져나간 다음 바로 CloseSocket 메서드 내부의 catch문으로 진행해버려 DoWorkEventHandler가 그 시점에서 중단돼 버리는 것이었습니다... 세상에.
DoWorkEventHandler에서 ObjectDisposedException이 발생할 건덕지를 없애버리니 정상 작동하는군요.
DoWork 이벤트 핸들러 내부 루프에서 소켓 컬렉션을 가지고 foreach 루프를 한 번 도는데, Disconnected된 Socket을 찾고 해당 Socket을 컬렉션에서 제거하는 작업을 하는 중 접속 해제된 소켓이 감지됐을 경우 Close하는 메서드의 catch문과 DoWorkEventHandler 내부의 catch문이 중복되는 것을 발견했습니다. (ObjectDisposedException)
즉, DoWorkEventHandler의 try 문 안에서 ObjectDisposedException이 발생하는데, 이 때 DoWorkEventHandler 내부의 catch문에서 일단 잡힌 후 빠져나간 다음 바로 CloseSocket 메서드 내부의 catch문으로 진행해버려 DoWorkEventHandler가 그 시점에서 중단돼 버리는 것이었습니다... 세상에.
DoWorkEventHandler에서 ObjectDisposedException이 발생할 건덕지를 없애버리니 정상 작동하는군요.
댓글
댓글 쓰기