본문 바로가기
심심풀이 개발

C# 멀티스레드

by WebHack 2011. 10. 16.

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