본문 바로가기
프로그래밍/C#

예제로 복습하는 C# 쓰레드 생성

by bantomak 2023. 6. 1.
반응형

C# 쓰레드 생성

System.Threading.Thread라는 클래스를 이용해서 쓰레드를 생성한다.

Run()이라는 함수를 생성해서 메인 쓰레드에서 실행하고 별도로 생성한 쓰레드에서 동시에 실행시킨다.

 

class Program
{
    static void Main(string[] args)
    {
        new Program().DoTest();
    }

    void DoTest()
    {
        // 새로운 쓰레드에서 Run() 실행
        Thread t1 = new Thread(new ThreadStart(Run));
        t1.Start();


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

    void Run()
    {
        Console.WriteLine($"Thread#{Thread.CurrentThread.ManagedThreadId}: Begin");

        // Do something
        Thread.Sleep(3000);
        Console.WriteLine($"Thread#{Thread.CurrentThread.ManagedThreadId}: End");
    }
}

 

result

 

C# 쓰레드 다양하게 생성하기

ThreadStart 델리게이트를 만족하는 다른 방식들 즉, 익명 메서드, 람다식 등으로 Thread 생성이 가능하다.

 

 class Program
{
    static void Main(string[] args)
    {
        // Run 메서드를 입력받아
        // ThreadStart 델리게이트 타입 객체를 생성한 후 
        // Thread 클래스 생성자에 전달
        Thread t1 = new Thread(new ThreadStart(Run));
        t1.Start();

        // 컴파일러가 Run() 메서드의 함수 프로토타입으로부터
        // ThreadStart Delegate객체를 추론해여 생성함
        Thread t2 = new Thread(Run);
        t2.Start();

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

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

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

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

 

C# 쓰레드 생성 예 - 다른 클래스 메서드 가져오기

동일 클래스가 아닌 다른 클래스의 메서드를 쓰레드에 호출하기 위해서는 해당 클래스의 객체를 생성한 후 그 객체의 메서드를 델리게이트로 Thread에 전달하면 된다.

 

class Helper
{
    public void Run()
    {
        Console.WriteLine("Helpler");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Helper helper = new Helper();

        Thread t1 = new Thread(new ThreadStart(helper.Run));
        t1.Start();
    }
}

 

C# Thread 클래스 파라미터 전달

Thread 클래스는 파라미터를 전달하지 않는 ThreadStart 델리게이트와 파라미터를 직접 전달하는 ParameterizedThreadStart 델리게이트를 사용할 수 있다.

 

class Program
{
    static void Main(string[] args)
    {
        // 파라미터 없는 ThreadStart 사용
        Thread t1 = new Thread(new ThreadStart(Run));
        t1.Start();

        // ParamerizedThreadStart 파라미터 전달
        // Start()의 파라미터로 radius 전달
        Thread t2 = new Thread(new ParameterizedThreadStart(Calc));
        t2.Start(10.00);

        Thread t3 = new Thread(() => Sum(10, 20, 30));
        t3.Start();
    }

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

    static void Calc(object radius)
    {
        double r = (double)radius;
        double area = r * r * 3.14;
        Console.WriteLine($"r={r}, area={area}");
    }

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

댓글