Last active
April 19, 2016 14:44
-
-
Save lisysolution/4dfbaddd239c99ccf710bd45c014fb9e to your computer and use it in GitHub Desktop.
C# Thread / ThreadPool 시작 후 이벤트를 받아서 종료하는 예제
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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