반응형
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");
}
}
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);
}
}
'프로그래밍 > C#' 카테고리의 다른 글
C# List에서 HashSet으로 변환하기 (26) | 2023.06.15 |
---|---|
계속 실행되어야 하는 작업을 위한 BackgroundService in .NET Core (58) | 2023.06.05 |
읽기 / 쓰기 프로퍼티(Property) 선언 및 사용 방법 (54) | 2023.05.31 |
C# nameof Expression (22) | 2023.05.26 |
C# 명명된 인자(Named Arguments)와 선택적 인자(Optical Arguments) (20) | 2023.05.25 |
댓글