Task 클래스와 이의 Generic형태인 Task<T>클래스는 .NET 4.0에 도입된 새로운 클래스들로서 쓰레드풀로부터 쓰레드를 가져와 비동기 작업을 실행한다. Task 관련 클래스들과 Parallel 클래스들을 합쳐 Task Parallel Library(TPL)이라 부르는데, 이들은 기본적으로 다중 CPU 병렬 처리를 염두에 두고 만들었다. Task 클래스는 .NET 4.0 이전 버전의 ThreadPool.QueueUserWorkItem()와 같은 기능을 제공하지만, 보다 빠르고 유연한 기능을 갖추고 있다. Task클래스 사용을 위해 흔히 사용되는 방법은 Task.Factory.StartNew()를 사용하여 실행하고자 하는 메서드에 대한 델리케이트를 지정하는 것이다. 이 StartNew()는 쓰레드를 생성과 동시에 실행하는 방식이고, 만약 시작을 하지 않고 Task 객체를 만들기 위해서는 Task() 생성자를 사용하여 메서드 델리게이트를 지정한다.
namespace MultiThrdApp
{
using System;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
// Task.Factory를 이용하여 쓰레드 생성과 시작
Task.Factory.StartNew(new Action<object>(Run), null);
Task.Factory.StartNew(new Action<object>(Run), "1st");
Task.Factory.StartNew(Run, "2nd");
Console.Read();
}
static void Run(object data)
{
Console.WriteLine(data == null ? "NULL" : data);
}
}
}
위의 Task.Factory.StartNew()는 쓰레드를 생성과 동시에 시작하는 방식이고, 만약 시작을 하지 않고 Task 객체만을 먼저 만들기 위해서는 Task 클래스 생성자를 사용하여 메서드 델리게이트를 지정, Task 객체만을 생성한다. 생성된 Task 객체로부터 실제 쓰레드를 시작하기 위해서는 Start() 메서드를 호출하고, 종료때까지 기다리기 위해선 Wait() 메서드를 호출한다.
namespace MultiThrdApp
{
using System;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
// Task 생성자에 Run을 지정 Task 객체 생성
Task t1 = new Task(new Action(Run));
// 람다식을 이용 Task객체 생성
Task t2 = new Task(() =>
{
Console.WriteLine("Long query");
});
// Task 쓰레드 시작
t1.Start();
t2.Start();
// Task가 끝날 때까지 대기
t1.Wait();
t2.Wait();
}
static void Run()
{
Console.WriteLine("Long running method");
}
}
}
그 외 호출 방법들
// 델리게이트 사용
Task task = new Task(delegate { PrintMessage(); });
task.Start();
// 람다 사용
Task task = new Task(() => PrintMessage() );
task.Start();
// 닷넷 4.5 이상
// Task. Run
public async Task DoWork() => await Task.Run(() => PrintMessage());
// Task FromResult
public async Task DoWork() => await Task.FromResult<int>(GetSum(4, 5));
int GetSum(int a, int b) => a + b;
'프로그래밍 언어 > C#' 카테고리의 다른 글
C# 오버플로우(Overflow), 언더플로우(Underflow) (0) | 2023.05.21 |
---|---|
C# Thread 클래스 (스레드) (0) | 2023.03.24 |
C# foreach 사용법과 다양한 예제 (0) | 2023.01.08 |
C# 배열 복사 (0) | 2023.01.08 |
C# 배열 초기화, 다차원배열, 가변배열에 대해서 (0) | 2023.01.07 |