Skip to content

Instantly share code, notes, and snippets.

@lisysolution
Last active April 19, 2016 14:44
Show Gist options
  • Save lisysolution/4dfbaddd239c99ccf710bd45c014fb9e to your computer and use it in GitHub Desktop.
Save lisysolution/4dfbaddd239c99ccf710bd45c014fb9e to your computer and use it in GitHub Desktop.
C# Thread / ThreadPool 시작 후 이벤트를 받아서 종료하는 예제
public Program()
{
// Thread의 처리 완료 이벤트를 받기 위한 클래스
ManualResetEvent doneEvent = new ManualResetEvent(false);
// Thread를 정의하고 시작 한다.
Thread t1 = new Thread(new ThreadStart(new ThreadExam(doneEvent).ThreadMethod));
// Thread 시작
t1.Start();
// Thread의 이벤트가 발생할때 까지 무기한 대기 한다.
// doneEvent이 이벤트가 발생하면 다음 처리를 시작한다.
WaitHandle.WaitAll(new ManualResetEvent[] { doneEvent }, -1);
/*
Thread는 명시적으로 Abort를 호출해야 종료를 한다.
Main이 끝나도 Abort를 호출하지 않으면 Thread는 계속 실행된다.
*/
t1.Abort();
Console.WriteLine("Thread end");
// 이벤트를 초기화 한다.
doneEvent.Reset();
// ThreadPool에 작업을 등록하고 실행한다.
ThreadPool.QueueUserWorkItem(new WaitCallback(new ThreadExam(doneEvent).ThreadPoolMethod));
// Thread의 이벤트가 발생할때 까지 무기한 대기 한다.
// doneEvent이 이벤트가 발생하면 다음 처리를 시작한다.
WaitHandle.WaitAll(new ManualResetEvent[] { doneEvent }, -1);
/*
ThreadPool는 Main과 같은 범위에서 실행이 되기 때문에
Main이 종료되면 Abort 와 같이 명시적인 종료 호출이 없어도 함께 종료 된다.
이 예제에서는 10번째 카운트에서 이벤트가 발생했기 때문에 다음 행으로 실행이 넘어 가는데
더이상 실행할 코드가 없어서 종료가 되면 ThreadPool도 함께 종료된다.
ThreadPool은 자동으로 종료가 되기 때문에 편리한 부분이 있지만 생명주기를 잘 고려해서 사용해야 한다.
*/
Console.WriteLine("ThreadPool end");
}
class ThreadExam
{
ManualResetEvent doneEvent;
public ThreadExam(ManualResetEvent e)
{
doneEvent = e;
}
public void ThreadMethod()
{
for (int i = 0; i < 20; i++)
{
Console.WriteLine("Thread{0}", i.ToString());
// 처리가 완료되었다는 이벤트를 발생 시킨다.
if (i == 10) doneEvent.Set();
Thread.Sleep(300);
}
}
public void ThreadPoolMethod(object obj)
{
for (int i = 0; i < 20; i++)
{
Console.WriteLine("ThreadPool {0}", i.ToString());
if (i == 10) doneEvent.Set();
Thread.Sleep(200);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment