시리얼통신 프로그램 하고있는데

시리얼통신으로 데이터 잘받고 처리후 Close 할때 Hang 현상이 발생 합니다...

그냥 Serial 통신 이벤트로 데이터를 받아서 처리하는데..

어떤 장비에서는 Close 할때 Hang 현상이 발생하지 않고

어떤 장비는 Close할때 Hang 현상이 발생합니다....




어떻게 구성했는지 모르는 상황이라 추측만으로 말씀드리게 되는데
 
a. Close( ) 는 시리얼 객체의 이벤트가 다 처리될때까지 기다립니다.
b. Control.Invoke 는 invoke가 처리될때까지 호출한 스레드에서는 대기합니다.
 
1. DataReceived 이벤트 핸들러에서 invoke로 ui쪽의 컨트롤을 변경하던 메이스레드에 작업을 요청하고 대기합니다.
2. 사용자에 의해 serialport.close 를 실행했다면 시리얼 쪽의 이벤트가 다 처리될때까지 기다립니다.
 이 close가 처리되기전에 DataReceived가 수행이 끝났다면 상관없는데 
 invoke 처리가 완료되기 이전에 close 하면 
 메인에서는 datarecieved가 끝나기를 기다리고
 serialport쪽에서는 invoke 처리가 끝나기를 기다리는 deadlock 상태가 됩니다.
 
-=Datarecieved 해도 소용없습니다. 이미 이벤트를 제거해도 기존에 발생한 이벤트핸들러는 처리될것이니까요.
begininvoke가 만능은 아닌데 추천해드린건 invoke와 달리 begininvoke는 ui 스레드쪽에 알아서 처리를 의뢰하고 호출 스레드는 계속 일을 하니까요.



출처

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNo=8&no=174021&ref=174021

Posted by 푸르른노을
,