Using System.Threading;
이렇게 추가해주세용~
class Program
{
static void Main(string[] args)
{
Console.Write("Thread 생성숫자 : ");
int thNumber = int.Parse(Console.ReadLine());
Console.WriteLine("System : {0}개 만큼 생성되었습니다", thNumber);
fakeServer fs = new fakeServer();
Thread[] tr = new Thread[thNumber];
for (int i = 0; i < tr.Length; i++)
{
tr[i] = new Thread(new ThreadStart(fs.Say));
tr[i].Start();
}
Thread.Sleep(5000);
Console.WriteLine("모든 농부가 작업한 횟수 : {0}" , fs.Count);
}
}
public class fakeServer
{
public int Count = 0;
public int food = 0;
public void Say()
{
lock (this)
{
int temp = Count;
while (true)
{
Random rd = new Random();
food += rd.Next(1, 20);
if (food >= 500)
{
Console.WriteLine("=======================================================================");
Console.WriteLine("농부{0} : 창고가 가득찼습니다^^", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("=======================================================================");
break;
}
Console.WriteLine("농부{0} : {1}개의 식량이 창고에 있습니다.", Thread.CurrentThread.ManagedThreadId, food);
temp++;
}
Thread.Sleep(300);
Count = temp;
}
food = 0;
}
}
추가
delegate void RunDelegate(int speed);
private void button1_Click(object sender, System.EventArgs e)
{
int turbo = 2; //전달할 파라메타
RunDelegate runDelegate = new RunDelegate(this.RunThread);
runDelegate.BeginInvoke(turbo,null,null);
}
#region Worker Thread 상에서 수행될 메서드(쓰레드 메서드임에도 매개변수를 가진다)
private void RunThread(int turbo)
{
for(int speed = 0; speed <= 100000; speed++)
{
this.textBox1.Text += String.Format("속도 : {0} 으로 달리고 있습니다\r\n",speed*turbo );
}
}
#endregion
쓰레드 메서드는 RunThread 이다.
이 메서드는 turbo 라는 int 형 매개변수를 받아 들인다.
그리고 델리게이트를 하나 선언한다.
delegate void RunDelegate(int speed);
이 델리게이트는 int 형 매개변수를 가지도록 한다
Go 버턴을 클릭하면 버턴 클릭 이벤트가 발생하며 이 이벤트 에서 다음과 같이 처리한다.
int turbo = 2; //전달할 파라메타
RunDelegate runDelegate = new RunDelegate(this.RunThread);
runDelegate.BeginInvoke(turbo,null,null);
델리게이트를 생성하면서 참조되는 메서드를 RunThread 로 지정한다.
그리고 델리게이트의 BeingInvoke 를 호출함으로써 RunTrhead 메서드를 비동기 처리한다.
위 코드에서 Thread 객체는 찾아 볼 수 없다.
이것이 쓰레드 인가??????
결론저긍로 말하자면, 명시적으로 Thread 객체를 생성하지 않았을 뿐이지 내부적으로 주 쓰레드와는 별도의 호출스택을
가지며 따라서 비동기 처리가 가능하다.
진정 Thread 객체를 사용해야 직성이 풀린다면 아래처럼 사용하던지..
delegate void RunDelegate(int speed);
private void button1_Click(object sender, System.EventArgs e)
{
ThreadStart ts = new ThreadStart(this.InvokeMethod);
Thread thread = new Thread(ts);
thread.IsBackground = true;
thread.Start();
}
private void InvokeMethod()
{
int turbo = 2; //전달할 파라메타
RunDelegate runDelegate = new RunDelegate(this.RunThread);
runDelegate.BeginInvoke(turbo,null,null);
}
#region Worker Thread 상에서 수행될 메서드(쓰레드 메서드임에도 매개변수를 가진다)
private void RunThread(int turbo)
{
for(int speed = 0; speed <= 100000; speed++)
{
this.textBox1.Text += String.Format("속도 : {0} 으로 달리고 있습니다\r\n",speed*turbo );
}
}
#endregion
처음의 코드를 한번 더 랩핑한 것과 같다.
Thread 객체가 호출하는 메서드는 InvokeMethod 이며 InvokeMethod 는 또다시 RunThread 를 비동기적으로 호출한다.
결국 RunThread 가 비동기로 호출되는 것이다.
단, 여기서 한가지 주의할 것이 있다.
Thread.Start() -> InvokeMethod() -> RunThread () 형태로 실행될 지라도
InvokeMethod 의 쓰레드와 RunThread 의 쓰레드는 서로 다른 쓰레드 이다.
각 메서드 안에
MessageBox.Show("쓰레드 :" + Thread.CurrentThread.GetHashCode().ToString());
로 보면 서로 다른 쓰레드 임을 알 수 있다.
'심심풀이 개발' 카테고리의 다른 글
data-reactid 삭제 하기 (0) | 2020.06.02 |
---|---|
centos nodejs8 버전 설치 (0) | 2020.04.14 |
자동화 서버는 개체를 작성할 수 없습니다 (0) | 2011.06.07 |
WPF에서 GIF 구현 (0) | 2011.04.18 |
C# 정규표현식 (0) | 2011.02.24 |