나의 지식 보관소
Task와 Task<TResult>그리고 Parallel 본문
병렬처리는 하나의 작업을 여러 작업자가 나눠서 수행한뒤 다시 하나의 결과로 만드는 것을 뜻한다.
비동기 처리는 A 작업을 시작한후 A의 결과가 나올 때까지 대기하는 대신 다른 작업을 수행하다가 A작업이 끝나면 그때 결과를 받아내는 방식을 뜻 한다.
System.Threading.Tasks.Task 클래스
Task 클래스는 인스턴스를 생성할 때 Action 대리자를 넘겨받는다. 즉 반환형을 갖지 않는 메서드와 익명메서드, 무명 함수등을 넘겨 받는다. 그후 Start()메서드를 호출하여 넘겨받은 Action 대리자를 비동기로 실행시킬수있다.
1
2
3
4
5
6
7
8
|
Task myTask = new Task( () =>
{
Thread.Sleep(1000);
Console.WriteLine("Hello");
}
);
myTask.Start();
|
또는 Task.Run() 메서드를 이용해서 다음과 같이 선언과 실행을 동시에 할 수 있다.
1
2
3
4
5
|
Task myTask = Task.Run( () =>
{
Thread.Sleep(1000);
Console.WriteLine("Hello");
});
|
반환값이 있는 Task<TResult> 클래스
위에서 살펴본 Task클래스와 달리 Task<TResult>클래스는 비동기 실행 결과를 반환한다. 그래서 비동기로 수행할 코드를 Action대리자 대신에 Func대리자로 받는다. 결과값은 Task.Result 속성으로 얻을수 있다. 그 외에 Task클래스와 사용법은 동일하다.
병렬 처리를 위한 Parallel 클래스
만약 소수찾기를 병렬적으로 수행하도록 프로그램을 구현하고 싶다면 Task<TResult>를 사용해서도 충분히 구현할 수 있다. 하지만 Parallel클래스를 사용하면 더더더욱 편해진다. 소수를 찾는 메서드인 Method1이 있다고 가정하고 아래의 코드를 보자.
1
|
Parallel.For(0, 100, Method1);
|
놀랍게도 저 한줄이 끝이다. 저 한줄이 Method1을 병렬적으로 호출하면서 0부터 100사이의 정수를 메서드의 매개변수로 넘겨준다.
'프로그래밍 언어 > C#' 카테고리의 다른 글
ADO.NET (0) | 2020.05.15 |
---|---|
async한정자와 await 연산자로 만드는 비동기 코드 (0) | 2020.05.06 |
익명 메서드와 람다식 (0) | 2020.05.06 |
이벤트 event (0) | 2020.05.05 |
대리자 (0) | 2020.05.05 |