C# 문법 공부 : Threading - 1

 

 

C# 문법공부 Threading -1

 

 

Program2

using System;
using System.Threading;

namespace Threading;

class Program2 //동일 클래스 안의 Run() 메서드를 실행하는 쓰레드를 하나 생성한 후 실행시키는 예제
{   
    public void DoTest() 
    {       
        Thread t1 = new Thread(new ThreadStart(Run)); // 새로운 쓰레드에서 Run() 실행
        t1.Start();

        Run(); // 메인쓰레드에서 Run() 실행
    }

    void Run()
    {
        Console.WriteLine("Thread#{0}: Begin", Thread.CurrentThread.ManagedThreadId);
        // Do Something
        Thread.Sleep(3000);
        Console.WriteLine("Thread#{0}: End", Thread.CurrentThread.ManagedThreadId);
        
        // 출력
        // Thread#1: Begin
        // Thread#3: Begin
        // Thread#1: End
        // Thread#3: End
    }
}

 

 

 

Program3

using System;
using System.Threading;

namespace Threading;

class Program3
{   
    int num =0;
    public void DoTest() //쓰레스 생성의 다양한 예제
    {   
        // Run 메서드를 입력받아
        // ThreadStart 델리게이트 타입 객체를 생성한 후
        // Thread 클래스 생성자에 전달
        Thread t1 = new Thread(new ThreadStart(Run));           
        t1.Start();
            
        // 컴파일러가 Run() 메서드의 함수 프로토타입으로부터
        // ThreadStart Delegate객체를 추론하여 생성함
        Thread t2 = new Thread(Run);
        t2.Start();

        // 익명메서드(Anonymous Method)를 사용하여
        // 쓰레드 생성
        Thread t3 = new Thread(delegate()
        {
            Run();
        });
        t3.Start();

        // 람다식 (Lambda Expression)을 사용하여
        // 쓰레드 생성
        Thread t4 = new Thread(() => Run());
        t4.Start();

        // 간략한 표현
        new Thread(() => Run()).Start();
    }

    void Run()
    {
        num +=1;
        Console.WriteLine("Run"+num);
    }
}

 

 

Program4

using System;
using System.Threading;

namespace Threading;

class Program4 //다른 클래스 메서드
{   
    public void DoTest()
    {
        // Helper클래스의 Run메서드 호출
        Helper obj = new Helper();
        Thread t = new Thread(obj.Run);
        t.Start();
    }
}
class Helper
{
    public void Run()
    {
        Console.WriteLine("Helper.Run");
    }
}

 

 

 

Program5

using System;
using System.Threading;

namespace Threading;

class Program5 //클래스 파라미터 전달
{   
    public void DoTest()
    {
        // 파라미터 없는 ThreadStart 사용
        Thread t1 = new Thread(new ThreadStart(Run));
        t1.Start();

        //함수 object로 넘길때
        // ParameterizedThreadStart 파라미터 전달 : Thread에서 실행되는 메서드를 나타냄
        Thread t2 = new Thread(new ParameterizedThreadStart(Calc));
        t2.Start(10.00); // Start(abc)의 파라미터로 radius 전달
        
        //함수 인자값 직접 넘길때
        // ThreadStart에서 파라미터 전달
        Thread t3 = new Thread(() => Sum(10, 20, 30));
        t3.Start();
    }

    static void Run()
    {
        Console.WriteLine("Run");
    }

    // radius라는 파라미터를 object 타입으로 받아들임
    static void Calc(object radius)
    {
        double r = (double)radius;
        double area = r * r * 3.14;
        Console.WriteLine("r={0},area={1}", r, area);
    }

    static void Sum(int d1, int d2, int d3)
    {
        int sum = d1 + d2 + d3;
        Console.WriteLine(sum);
    }
}

 

 

Program6

using System;
using System.Threading;

namespace Threading;

class Program6 //Background 쓰레드 vs Foreground 쓰레드
{   
    public void DoTest()
    {   
        //Thread.IsBackground : true=Background / false=Foreground

        //Foreground : 메인 쓰레드가 종료되더라도 Foreground 쓰레드가 살아 있는 한, 프로세스가 종료되지 않고 계속 실행
        //Background : 메인 쓰레드가 종료되면 바로 프로세스를 종료

        // Foreground 쓰레드
        Thread t1 = new Thread(new ThreadStart(Run));            
        t1.Start();
                    
        // 백그라운드 쓰레드
        Thread t2 = new Thread(new ThreadStart(Run));
        t2.IsBackground = true;
        t2.Start();
    }

    static void Run()
    {
        Console.WriteLine("Run");
    }
}

 

 

 

 

pThreadPools

using System;
using System.Threading;

namespace Threading;

class pThreadPools //ThreadPool 사용 : 실행되는 메서드로부터 리턴 값을 돌려받을 필요가 없는 곳에 주로 사용
{   
    public void DoTest()
    {   
        //ThreadPool.QueueUserWorkItem
        //실행을 위해 메서드를 큐에 대기시킵니다. 스레드 풀 스레드를 사용할 수 있을 때 실행됩니다.

        // 쓰레드풀에 있는 쓰레드를 이용하여 Calc() 메서드 실행. 리턴값 없을 경우 사용.
        ThreadPool.QueueUserWorkItem(Calc);         // radius=null
        ThreadPool.QueueUserWorkItem(Calc, 10.0);   // radius=10
        ThreadPool.QueueUserWorkItem(Calc, 20.0);   // radius=20

        String tmp = Console.ReadLine();            //콘솔창에서 입력받은 값
        Console.WriteLine("tmp="+tmp);
    }

    static void Calc(object radius)
    {
        if (radius == null) return;

        double r = (double)radius;
        double area = r * r * 3.14;
        Console.WriteLine("r={0}, area={1}", r, area);
    }
}

 

 

 

pFunc

using System;
using System.Threading;

namespace Threading;

class pFunc //Func 대리자 사용법 3가지
{
    public void DoTest()
    {   
        //1.기존 메서드 지정(함수)
        //선언 || Func<string> func = 함수이름;
        //호출 || func(함수에 넘길 값);

        //1-1.
        Func<string,string> func1 = Print;
        Console.WriteLine( func1("1-1. 기존 메서드 지정") );

        //1-2.
        Func<int,int,int> func2 = Sum;
        string msg = string.Format("1-2. X + Y = {0} 입니다", func2(2,4));
        Console.WriteLine(msg);

        //2.무명 메서드 지정(델리게이트)
        //선언 || Func<int> func = delegate (int x, int y) { return x+y; };
        //호출 || func(델리게이트에 넘길 값 x,y);
        Func<int,int,int> func3 = delegate (int x, int y) { return x+y; };
        string str = string.Format("2. x + y = {0}", func3(5,10));
        Console.WriteLine(str);

        //3.람다식 사용
        //선언 || Func<int> func = x => { return x; };
        //호출 || func(x에 대입할 값);
        Func<int,string> func4 = x => { return "3. 반환값은 : " + x + "입니다"; };
        Console.WriteLine(func4(100));
    }

    public static string Print(string tmp)
    {
       return tmp;
    }

    public static int Sum(int x, int y){
        return x+y;
    }
}

 

 

 

 

pAsynchronous

using System;
using System.Threading;

namespace Threading;

class pAsynchronous //비동기 델리게이트 (Asynchronous Delegate) : 왜인지 모르겠지만 오류남
{   
    public void DoTest()
    {   
        //synchronous  : 동기
        //Asynchronous : 비동기

        // GetArea() 메서드를 사용하여 
        // .NET의 Func 델리게이트 인스턴스를 생성        
        // Func의 처음 2개 int는 입력, 마지막 int는 출력 타입
        Func<int, int, int> work = GetArea;

        //IAsyncResult : 비동기 작업의 상태를 나타냅니다.
        // 델리게이트객체로부터 BeginInvoke() 실행
        IAsyncResult asyncRes = work.BeginInvoke(10, 20, null, null); // 두 개의 입력 파라미터 10, 20 지정

        Console.WriteLine("Do something in Main thread");

        // 델리게이트객체로부터 EndInvoke(IAsyncResult) 실행
        // EndInvoke는 쓰레드가 완료되길 기다린다.
        // 완료후 리턴 값을 돌려받는다.            
        int result = work.EndInvoke(asyncRes);

        Console.WriteLine("Result: {0}", result);
    }

    static int GetArea(int height, int width)
    {
        int area = height * width;
        return area;
    }
}

'C#' 카테고리의 다른 글

C# 문법 공부 : Threading - 3  (0) 2024.05.03
C# 문법 공부 : Threading - 2  (0) 2024.05.03
C# 문법 공부 : ThreadingForm  (0) 2024.04.29
C# 문법 공부 : WindowsForms  (0) 2024.04.29
C# 문법 공부 : Timer  (0) 2024.04.29