C#

[C#] - 비동기 처리 : task

Riucc 2019. 4. 9. 09:57

○ 비동기 처리 : task 

 

- 비동기 처리 : task

     C# 4.0 이후부터 Task 클래스를 사용하여, 쓰레드를 쉽게 생성하고 관리할 수 있다

     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
25
26
27
28
29
30
31
32
33
static void Main(string[] args)
{
      Task task1 = new Task(
       () =>
            {
                Console.WriteLine("Process taskitem task1");
            });
       task1.Start();
 
        Task task2 = new Task(
            (obj) =>
            {
                 Console.WriteLine("Process taskitem(obj) task2");
            }, null);
        task2.Start();
 
        Task task3 = new Task(() =>
        {
            Thread.Sleep(5000);
            Console.WriteLine("Process sleep task3");
        });
        task3.Start();
        task3.Wait();
 
        Task task4 = new Task(
           () =>
            {
                Console.WriteLine("Process taskitem task4");
            });
        task4.Start();
 
        Console.ReadLine();
 }
cs



Task는 순서없이 실행되며, 가장 딜레이가 짧은 것부터 종료된다

Wait 함수를 사용했으므로 5초간 task3에서 task3이 동작 종료될때까지 멈추며, 

task3이 종료 시  task4가 실행되며 종료된다


- Task 생성없이 TaskFactory 타입의 StartNew() 사용


1
2
3
4
5
6
7
8
9
10
Task.Factory.StartNew(() =>
{
      Console.WriteLine("Factory 이용 Task 객체 생성필요 없이");
});
 
Task.Factory.StartNew(
     (obj) =>
     {
      Console.WriteLine("Factory 이용 Task 객체 생성필요 없이(obj)");
}, null);
cs


- Task<TResult> 타입 : 값을 반환

     

1
2
3
4
5
6
7
8
9
Task<int> taskInt = new Task<int>(
     () => {
                Random rand = new Random((int)DateTime.Now.Ticks);
                return rand.Next();
 
     });
taskInt.Start();
taskInt.Wait();
Console.WriteLine("무작위 숫자 값 : " + taskInt.Result);
cs


- Task<TResult> 타입 TaskFactory 타입의 StartNew() 사용


1
2
Task<int> taskInt2 = Task.Factory.StartNew<int>(() => 1);
Console.WriteLine(taskInt2.Result);
cs

-

- Task.Run 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
static void Main(string[] args)
{
        ShowThreadInfo("Application");
 
        Task t = Task.Run(() => ShowThreadInfo("Task"));
        t.Wait();
}
 
static void ShowThreadInfo(String s)
{
        Console.WriteLine("{0} Thread ID: {1}",
                          s, Thread.CurrentThread.ManagedThreadId);
}
cs