소프트웨어/C# & ASP.NET

C# 쓰레딩 [시작과 종료]

falconer 2009. 8. 12. 19:04

쓰레드라고 하는것이 한때는 고수들의 전유물이었는데 요즘은 강호고수들이 많아져서인지 아무나 쓰는 기술되었다.
뭐 암튼 대충 쓰레드에 대해 정리하자는 차원에서 써둠을 밝히니 향후에 제대로 안된다고 이런거 하지말자.

1. 쓰레드 사용하기
일단 닷넷의 쓰레드는 굉장히 쓰기쉽다.
다음의 예제를 함해보자.

using System;
using System.Threading;  //쓰레드를 쓰겠다고 선언하자.

class Test {
  static void Main(){
   Console.WriteLine("카운트 0부터 49까지 세기!");
   ThreadStart th = new ThreadStart(work); //1.work메소드를 위임하자.
   Thread t = new Thread(th); //2.쓰레드생성하자.
   t.Start(); //3.시작
   Console.WriteLine("끝!");
  }
  public static void work(){
   for (int i = 0; i<50; i++){
    Console.WriteLine("Conut:{0}",i);
   }
  }
}

결과를 보면 짜잔!
사용자 삽입 이미지

* Ultraedit에서 컴파일하고 실행한 결과창임. 이렇게 하고싶으신분들은 본 블로그 잘뒤져보면 나옴.

2. 쓰레드 중지하기
쓰레드를 중지하기위해서는 2가지 방법이 있다.
- Abort()
- Join()
Abort()는 강제종료이므로 어디서 끝날지 아무도 모른다. 신도 모른다.
Join()은 쓰레드가 다 실행될때 까지 기다렸다가 종료시킨다.
다음예제를 보자

using System;
using System.Threading;

class Test {
  static void Main(){
   Console.WriteLine("카운트 0부터 1만까지 세기!");
   ThreadStart th = new ThreadStart(work);
   Thread t = new Thread(th);
   t.Start(); //시작
   t.Abort(); //강제종료
   Console.WriteLine("끝!");
  }
  public static void work(){
   for (int i = 0; i<10000; i++){
    Console.WriteLine("Conut:{0}",i);
   }
  }
}


이녀석을 실행해보면 Abort()때문에 이렇게 된다.
사용자 삽입 이미지

코드에서는 1만까지 진행하는것으로 만들어졌지만 강제종료되어 8524에서 종료되었다.
한번 더 해보자.

사용자 삽입 이미지
어쩌구리.. 이번에는 다 돌아 버렸다... ㅡㅡ;; 암튼 이런식으로 예측이 불가능한 코드가 되어버린다. 중간에 종료하는것은 왠만하면 하지말고 Join()을 사용하도록 하자.
위코드에서 다음과 같이 수정한다.
   ...전략...
   t.Start(); //시작
   t.Join(); //이전에 t.Abort()임
   Console.WriteLine("끝!");
   ...후략...

사용자 삽입 이미지
이번에는 다 돈다. (사실은 위의 이미지와 같은 이미지임.. 흐흐흐)

3. 쓰레드의 쉬게하기
이번에는 일하다가 중간에 쉬게 해보자.
using System;
using System.Threading;

class Test {
  static void Main(){
   Console.WriteLine("쓰레드 시작");
   ThreadStart th = new ThreadStart(work);
   Thread t = new Thread(th);
   t.Start();
   Console.WriteLine(t.ThreadState);
   Console.WriteLine("끝!");
  }
  public static void work(){
   Thread.Sleep(100);
  }
}


사용자 삽입 이미지
쓰레드가 시작되고 Sleep명령으로 인해 Sleep모드로 들어갔다.

명령이 주어질때까지 중지하고 싶다면 Suspend()를 사용하자. Suspended된놈을 다시 살리는 것은 Resume()이 있는데 이건 알아서 한번 만들어 보도록 하자.

결론적으로 .NET의 쓰레드(Thread)는 다음과 같은 상태값을 가진다.
(ThreadState()로 나오는 결과값이 바로 타원형안에 있는 녀석들이다.)

사용자 삽입 이미지
이 표만 잘봐두면 쓰레드 어려운것이 아니다.
일단 생성된 쓰레드는 Unstarted라는 값을 가진다. Start()라는 메소드로 Started라는 상태값을 가지게 되는 것이다. 다시말해 타원안에 있는 것은 상태값, 화살표에 있는 것이 바로 메소드 되겠다.

다음에는 멀티 쓰레드 함 해보자.

* 본 게시물에서 사용한 쓰레드라는 표현은 "Thread"의 한음표현이며 쓰레드는 스레드라고도 표기됩니다. Microsoft공식학습서 Inside C# 2nd Ed.에는 쓰레드라고 표기되어 있어 본 게시물도 쓰레드라고 표현함을 알려드립니다.


출처 : http://www.wolfpack.pe.kr/120?category=2