Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

나의 지식 보관소

Task와 Task<TResult>그리고 Parallel 본문

프로그래밍 언어/C#

Task와 Task<TResult>그리고 Parallel

야식은진리다 2020. 5. 6. 03:34

병렬처리는 하나의 작업을 여러 작업자가 나눠서 수행한뒤 다시 하나의 결과로 만드는 것을 뜻한다.

비동기 처리는 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(0100, 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