이번엔 현업에서 사용한 사례가 있어, 스레드의 활용에 대해서 간단하게 정리해보겠습니다.
이 포스팅을 읽기 전에 제가 정리한 프로세스와 스레드 포스팅을 읽고 오시면 이해하기 쉽습니다.
2024.04.03 - [분류 전체보기] - 프로세스 process & 스레드 thread (컨텍스트 스위칭)
프로세스 process & 스레드 thread (컨텍스트 스위칭)
프로세스와 스레드는 거의 모든 OS에서 실행되는 프로그램을 공통적으로 설명할 수 있는 기초 단위입니다. 응용 개발자로써, 깊이 알필요는 없지만, 대충이라도 이해하는 건 필수라고 생각되네
devofbright.tistory.com
이슈 사항
윈폼으로 만든 아래의 구성의 화면이 너무 느리다는 이슈사항이었습니다.
화면 구성이 대강 아래와 같았습니다.
확인 해보니, 1번 2번 3번 화면 모두가 각각의 프로세스로 변경되어야 하는데 10~20초 정도 변화가 없었습니다.

1번 부분에 DB에서 가져온 데이터로 뿌려주는 부분인데,
이게 1초에 한번씩 DB 접속을 시도하는데요.
쿼리가 잘못 구성되어 있어서 인지, 응답속도가 현저하게 떨어져있었습니다.
1초에 한번씩 실행해주는 타이머는 아래와 같은 클래스입니다.
System.Windows.Forms.Timer
공식 홈페이지에서 확인 결과 위 타이머는 메인 스레드에서 동작하는 동기화 개체이기 때문에,
1번 프로세스에서 db 접속하여 데이터를 가져오는 동안 2번,3번 화면들도 동작을 하지 안았던 겁니다.

해결
일단 위의 그림에서 1번, 2번, 3번 화면이 각각의 데이터를 가져오고 서로 독립되게 연결해야 하기 때문에 아래와 같이 timer 종류를 변경해주었습니다.
System.Windows.Forms.Timer
// 동기화 타이머를 아래의 스레드 타이머로 변경
System.Threading.Timer
1번 화면의 프로세스에서 db 접속,네트워크 지연이 생겨도 2번,3번 프로세스에서는 영향이 없도록 변경되었습니다.
아래와 같이 소스로 간단하게 변경했습니다.
public class test : formBase{
//기존 타이머
//private System.Windows.Forms.Timer testTimer;
//변경 스레드 타이머
private System.Threading.Timer testTimer;
public test(){
testTimer = new System.Threading.Timer(testTimerProcess, null, 0, 1000);
}
public void testTimerProcess(){
// 기존 프로세스 변경 X
grid.Invoke(new Action(() =>
{
grid.Text = "변경";
}));
}
}
주의할 점은 메인 스레드가 아닌 서브 스레드로 winform의 view(위의 예시에서는 grid)에 접근할 때, invoke를 사용하여 접근해야합니다.
이유는 여러가지 스레드에서 하나의 view에 접근시, 무슨 스레드에서 바꿔줘야하는지 모호하기 때문에(충돌이 생길수 있기 때문에) Invoke를 통해 view에 접근해야합니다.
긴글 읽어 주셔서 감사합니다.
더 궁금하신 사항은 댓글로 문의해주시면 빠르게 답변드리겠습니다.
댓글