C#

멀티스레드

윤태영(Coding) 2023. 6. 13. 13:51

< 멀티 스레드 >

멀티스레드란, 하나의 프로그램 안에서 여러 개의 작업 흐름을 동시에 실행하는 것을 말한다.

컴퓨터 프로그램은 기본적으로 순차적으로 실행된다. 즉, 한 번에 하나의 작업만 수행하게 된다.

일반적인 프로그램 실행 순서

하지만 멀티스레드를 사용하면, 여러 작업을 동시에 처리할 수 있어서 프로그램이 훨씬 효율적으로 동작한다.

 

예를 들어, 웹 브라우저를 사용하면서 동영상을 시청하고 있으면, 웹 브라우저는 멀티스레드를 사용하여 동영상을 스트리밍 하는 동안에도 사용자의 입력을 받아 처리할 수가 있는 것이다.

< C# 멀티스레드 문법 >

Thread thread = null;
thread = new Thread(new ThreadStart(GetItemThread));
thread.IsBackground = true;
thread.Priority = ThreadPriority.Normal;
thread.Start();
  • Thread thread = null; : Thread 객체를 선언한다. 여기서 Thread는 새로운 작업 흐름을 나타낸다
  • thread = new Thread(new ThreadStart(GetItemThread));    새로운 Thread 객체를 생성하고, 이 Thread에서 실행할 메서드(GetItemThread)를 지정한다.
  • thread.IsBackground = true;  : 이 Thread를 백그라운드로 설정한다. 백그라운드 스레드는 프로그램이 종료될 때 자동으로 종료된다.
  • thread.Priority = ThreadPriority.Normal   : Thread가 OS 자원을 얼마나 자주 할당받을 것인지 (보통 normal, above를 자주 쓴다.)
  •  thread.Start();   thread를 시작하게 된다. 시작하게 되면 ThreadStart(GetItemThread));에서 GetItemThread 함수가 가장 먼저 실행된다. 

< 실습해 보기 >

위의 코드를 실행하면 Form1의 "AAAA테스트" MessageBox가 5초 후에 나오는 것을 확인할 수 있다.

 

만약 Thread.Sleep()을 Form_Load함수에 넣으면 어떻게 될까?

위 코드를 실행하게 되면 BBB테스트가 먼저 출력이 되고, 확인을 누르면(안 누르면 그다음으로 안 넘어간다.) AAAA테스트 메시지가 찍히고 나서 Form1창이 뜨는 것을 직접 확인할 수 있다. 

실행하면 2초후에 BBB테스트
BBB테스트 누른 후 4초후 AAAA테스트
이후 Form1창이 출력된다.

< Thread 1개 더 생성해 보기 >

이렇게 코드를 작성하게 된다면

Form1이 Load 되고 나서 Thread안에 있는 동작이 이루어지게 된다. BBB테스트가 2초 후에 출력되고, 확인을 누를 필요 없이, Form1 Load 됨과 동시에 5초 후에 AAA테스트 메시지가 나타난다. 즉, 각각의 스레드는 별개로(병렬적) 동작한다는 것을 알 수 있다. 

 

이러한 Thread는 병렬작업과 오래 걸리는 작업에 유용하게 사용된다.(예 네트워크전송, 수신, DB작업)

또한 로딩창, 로딩바를 호출해서 사용자 편의성을 증가시킬 수도 있다. 

< try catch로 감싸기 >

Thread의 함수들을 try catch로 감싸서 오류내용을 메모장 같은 곳에 기록을 할 수 있다.

 

또한 반복문을 통해서, 어떠한 작업이 반복적으로 일어나게 할 수도 있다. 그런데 While문에서 오류를 만나면 While문에서 빠져나오게 된다. 그때 계속 동작을 시키고 싶다면, try catch()로 감싸주면 While문을 빠져나가지 않고  계속 동작할 수 있도록 할 수 있다.

 

< 주의사항 >

Form2가 있다고 가정했을 때, 

Form1_Load 함수에 

Form2 form2 = new Form2();

form2.Show(); 이렇게 작성하면 form2가 개별 Thread로 동작할 것 같지만, 동작하지 않는다.

개별 스레드로 동작하지 않는 코드

만약 Form2에서 어떠한 작업, 개별적으로 실행하고자 한다면

Form2의 Thread로 작성해야 한다.

 

또한, Thread는 여러 개 만들 수 있는 것을 기억해야 한다.

 

 

Reference : C#. NET 0.5년 차~3년 차(파트 1)

이 블로그의 모든 내용은 원작자와 출판사로부터 허락을 받아 작성되었습니다.
https://www.inflearn.com/course/lecture?courseSlug=%EB%8B%B7%EB%84%B7-%EC%9C%88%ED%8F%BC-1&unitId=77886&tab=curriculum 

 

학습 페이지

 

www.inflearn.com