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 |