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
class Program
    {
        static void Main(string[] args)
        {
            const int Repetitations = 10000;
 
            //닷넷 4.5 전에 TPL에서는 
            //Task.Factory.StartNew<string>() 를 이용한다.
            Task task = Task.Run(() =>
            {
                for (int count = 0; count < Repetitations; count++)
                {
                    Console.Write('-');
                }
 
            });
 
            for (int i = 0; i < Repetitations; i++)
            {
                Console.Write('+');
            }
 
            // 작업이 끝나기를 기다린다.
            task.Wait();
        }
    }
cs

비동기 패턴, Task 클래스를 이용하며 Task가 끝나기를 기다리기 위해 Wait 함수를 이용.

비동기가 시작되는 상황을 'Hot' 하다고 하고 비동기가 진행되지 않은 상황을 Cold 하다고 한다.

'.NET 개발 > C#' 카테고리의 다른 글

EntityFramework 활용하기.  (0) 2015.11.09
인터페이스 사용 이유  (0) 2015.10.27
Task<T> Class  (0) 2015.08.10
Task Class 비동기  (0) 2015.08.10
Thread Class  (0) 2015.07.31
Posted by Hoya0415
,

Task<T> Class

.NET 개발/C# 2015. 8. 10. 13:20
C# Task<T> 클래스 

Non-Generic 타입인 Task 클래스는 ThreadPool.QueueUserWorkItem()과 같이 리턴값을 쉽게 돌려 받지 못한다. 비동기 델리게이트(Asynchronous Delegate)와 같이 리턴값을 돌려 받기 위해서는 Task<T> 클래스를 사용한다. Task<T> 클래스의 T는 리턴 타입을 가리키는 것으로 리턴값은 Task객체 생성 후 Result 속성을 참조해서 얻게 된다. Result 속성을 참조할 때 만약 작업 쓰레드가 계속 실행 중이면, 결과가 나올 때까지 해당 쓰레드를 기다리게 된다. 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void Main(string[] args)
        {
            // Task<T>를 이용하여 쓰레드 생성과 시작
            Task<int> task = Task.Factory.StartNew<int>(() => CalcSize("Hello World"));
 
            // 메인쓰레드에서 다른 작업 실행
            Thread.Sleep(1000);
 
            // 쓰레드 결과 리턴. 쓰레드가 계속 실행중이면
            // 이곳에서 끝날 때까지 대기함
            int result = task.Result;
 
            Console.WriteLine("Result={0}", result);
        }
 
        static int CalcSize(string data)
        {
            string s = data == null ? "" : data.ToString();
            // 복잡한 계산 가정
 
            return s.Length;
        }
cs


'.NET 개발 > C#' 카테고리의 다른 글

인터페이스 사용 이유  (0) 2015.10.27
18.3 비동기 태스크 호출  (0) 2015.09.14
Task Class 비동기  (0) 2015.08.10
Thread Class  (0) 2015.07.31
.Net Remoting  (0) 2015.07.30
Posted by Hoya0415
,

Task 클래스

Task 클래스와 이의 Generic형태인 Task<T>클래스는 .NET 4.0에 도입된 새로운 클래스들로서 쓰레드풀로부터 쓰레드를 가져와 비동기 작업을 실행한다. Task 관련 클래스들과 Parallel 클래스들을 합쳐 Task Parallel Library(TPL)이라 부르는데, 이들은 기본적으로 다중 CPU 병렬 처리를 염두에 두고 만들었다. Task 클래스는 .NET 4.0 이전 버전의 ThreadPool.QueueUserWorkItem()와 같은 기능을 제공하지만, 보다 빠르고 유연한 기능을 갖추고 있다.


방법 1

TaskFactroy.StartNew : Task를 만들고 시작합니다.  스레드 생성과 시작 동시에 

1
2
3
4
5
6
7
8
9
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();
        }
cs

방법 2

Task 객체 만들고 Start() -> Wait();

Task 객체로부터 실제 쓰레드를 시작하기 위해서는 Start() 메서드를 호출하고, 종료때까지 기다리기 위해선 Wait() 메서드를 호출한다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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");
        }
cs


'.NET 개발 > C#' 카테고리의 다른 글

18.3 비동기 태스크 호출  (0) 2015.09.14
Task<T> Class  (0) 2015.08.10
Thread Class  (0) 2015.07.31
.Net Remoting  (0) 2015.07.30
Laze 클래스 란?  (0) 2015.07.21
Posted by Hoya0415
,