본문 바로가기

Coding Diary/C,C++,C#

스레드 간섭 간 생긴 일 1편

요즘 진행 중인 프로젝트는

 

자이로 센서를 이용한 모터 오작동 감지

 

센서의 개수가 32개!!

..... 그럼 소켓을 총 32 채널을 열어야 한다는 말이다...

 

또 Tcp 통신을 사용하다 보면 Reconnection이 매우 중요하다..

고민하다 고민 하다 Dictionary와 Tuple을 같이 사용하려고 했는데.....

(여기서 문제임...)

 

 

 

... 위에 보면 tuple의 타입 개수는 총 3개 - 연결 상태와 채널의 번호, 그리고 해당 Tcpclient 소켓을 받아서 

저장해서 사용하는 중이었는데..

 

Timer를 사용하여 연결 상태 값을 조회하여 false 전환 시에 Reconnection try 문을 작성하는 중이었는데.. 문제가 생겼다...

 

문제는 타이머와 connection Task와의 혼선...

 

타이머는 system.Timers.timer를 사용하다 보니...

스레드 타이머의 특징은 폼의 스레드(메인 스레드)와 상관 없이 worker thread에서

동작을 하다보니 비동기 연결 통신을 동작을 하게 되면 tuple의 값이 변화하면서

값 변화때문에 문제가 생기게 된다.

 

비동기 어려움.... 많이...

 

foreach문이 돌면서 value 값을 찾는 데 바뀌니까 오류로 바뀌는 현상이....

 

 

해결법은...

 

타이머를 폼 타이머로 변경하면 되더라....