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이 발생할 건덕지를 없애버리니 정상 작동하는군요.

댓글

이 블로그의 인기 게시물

C# 남아도는 메모리에도 불구하고 OutOfMemoryException이 발생한다면?

USB를 뒤는 괜찮은데 앞에 꽂으면 인식이 힘들다?

MySQL 데이터 타입과 Java 데이터 타입 비교/매칭