posted by 방랑군 2012. 1. 21. 22:46

출처 :  http://blog.naver.com/prokyhsigma?Redirect=Log&logNo=120109045619

스레드함수.cs

class ThreadTest
{
// 스레드 동기화 및 일시정지, 재시작
private ManualResetEvent _shutdownEvent = new ManualResetEvent(false);
private ManualResetEvent _pauseEvent = new ManualResetEvent(false);

private Thread m_thread;


public ThreadTest()
{
m_thread = new Thread(new ThreadStart(threadFunc));
m_thread.Name = "test";
m_thread.IsBackground = true;
m_thread.Start();
}


private void threadFunc()
{
int i = 0;

while(_pauseEvent.WaitOne())
{
System.Diagnostics.Trace.WriteLine(i.ToString());
i++;
Thread.Sleep(1000);

}
}


// --------------------------------------------------------------------------------
// 스레드 일시정지
// --------------------------------------------------------------------------------
public void pause()
{
_pauseEvent.Reset();
}//end pause()

// --------------------------------------------------------------------------------
// 스레드 재시작
// --------------------------------------------------------------------------------
public void resume()
{
_pauseEvent.Set();
}//end resume()

// --------------------------------------------------------------------------------
// 스레드 종료 준비, 동기화 이벤트 처리
// --------------------------------------------------------------------------------
public void readyEndThread()
{
_shutdownEvent.Set();
_pauseEvent.Set();
}//end endThread()
}
}

메인.cs

static void Main(string[] args)
{
ThreadTest test = new ThreadTest();
test.resume();

Thread.Sleep(3000);
test.pause();

Thread.Sleep(3000);
test.resume();

Thread.Sleep(30000);
}

메인 클래스에서 스레드 함수를 자유롭게 통제 가능해진다.

결과> 1, 2, 3 출력 후 3초 뒤 다시 4, 5, 6 다시 3초뒤 나머지 30초동안 뒷 숫자가 출력이 된다.

[ 주의점 ]

1. 이벤트 초기값 false로 스레드를 처음부터 일시정지 시켜놓을 수 있다. true면 바로 시작.

2. 반복문의 조건을 _pauseEvent.WaitOne()) 으로 두어서 신호를 반복문 제어값으로 해놓는다.