private void btnSyncCall_Click(object sender, EventArgs e)
{
TheWorker worker = new TheWorker();
worker.DoWork();
MessageBox.Show("작업을 종료했습니다.");
}
class TheWorker
{
public void DoWork()
{
Console.WriteLine("Beginning of Dowork Method");
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);
}
Console.WriteLine("End of Dowork Method");
}
public void DoWork2(object state)
{
Console.WriteLine("Beginning of Dowork2 Method");
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);
}
Console.WriteLine("End of Dowork2 Method");
}
}
private void btnAsyncCall1_Click(object sender, EventArgs e)
{
TheWorker worker = new TheWorker();
ThreadStart start = new ThreadStart(worker.DoWork);
Thread thread = new Thread(start);
thread.IsBackground = true;
thread.Start();
Thread.Sleep(1000);
MessageBox.Show(thread.ThreadState.ToString());
}
private void btnAsyncCall2_Click(object sender, EventArgs e)
{
TheWorker worker = new TheWorker();
WaitCallback wcb = new WaitCallback(worker.DoWork2);
ThreadPool.QueueUserWorkItem(wcb);
Thread.Sleep(1000);
MessageBox.Show("스레드풀을 이용했습니다.");
}
private void btnAsyncCall3_Click(object sender, EventArgs e)
{
int i = 0;
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 2000;
timer.Tick += delegate(object sender2, EventArgs e2)
{
if (i < 10)
{
Console.WriteLine("작업이 처리되었습니다");
i++;
}
else
{
timer.Dispose();
Console.WriteLine("작업완료");
}
};
timer.Start();
}
private void btnSynchronize_Click(object sender, EventArgs e)
{
TheWorker worker1 = new TheWorker();
TheWorker worker2 = new TheWorker();
Thread thread1 = new Thread(new ThreadStart(worker1.DoSum));
Thread thread2 = new Thread(new ThreadStart(worker2.DoSum));
thread1.IsBackground = true;
thread2.IsBackground = true;
thread1.Start();
thread2.Start();
}
class TheWorker
{
private static int result;
private static AutoResetEvent are = new AutoResetEvent(true);
public void DoSum()
{
are.WaitOne(); //신호상태 대기, 진입후 비신호상태로 변경
{
result = 0;
for (int i = 0; i <= 100; i++)
{
result += i;
if (i % 100 == 0)
Thread.Sleep(1000);
}
Console.WriteLine("1부터 1000까지의 합 : " + result);
}
are.Set(); //신호받음 상태로 변경
}
}
AutoResetEvent를 이용하여 초기상태를 받아오게 됩니다. 그리고 한 객체가 들어와서 변수를 쓰고 있으면 해당 변수에 접근할 수 없도록 닫아 버리고 해당 변수의 처리가 끝나면 Set() 메소드를 이용하여 처리 완료를 알리고 다른 Thread에서 처리를 할 수 있도록 처리 해주는 겁입니다. 이렇게 함으로써 동기화문제를 처리하는 것이죠.
Thread에 대해서 아주 간단하고 쉬운 예제로 알아보았는데요. 많은 도움이 되셨는지는 모르겠습니다. 내용이 많이 부족해서요. C#을 처음 접하시는 분이나 아직 스레드에 대해서 잘 모르겠다 싶은 분들에게 좀이라도 도움이 될까 싶어서 이렇게 포스팅 해봅니다.
더 좋은 내용의 포스팅을 약속 드립니다 ^^
엔젤루스였습니다~
'.NET > C#' 카테고리의 다른 글
try~catch문(예외처리) (3) | 2010.10.14 |
---|---|
스레드 정보 알아오기... (0) | 2010.10.12 |
C# 소수(Prime Number) 찾기 (0) | 2010.10.12 |
C# 프로세스 목록 알아오기 (1) | 2010.10.11 |
Windows Forms의 시작 (2) | 2010.01.19 |
C# Event (0) | 2010.01.18 |
C# delegate (0) | 2010.01.14 |
FileAndDirectory (0) | 2010.01.12 |
C# File Input/Output (1) | 2009.12.24 |
C# Collection (0) | 2009.12.21 |