Home 3. Task_1
Post
Cancel

3. Task_1

Build Up

Action/Func - Task - async/await

설명

  • 값을 반환 하지 않고 비동기적으로 실행 되는 단일 작업을 나타냄.
  • .NET Framework 4에서 처음 도입 된
    작업 기반 비동기 패턴 의 중심 구성 요소 중 하나.
  • 일반적으로 main 스레드에서 동기적으로 실행되지 않고
    스레드 풀 스레드에서 비동기적으로 실행되므로
    Status, IsCancelled, IsCompleted, IsFaulted 속성을 사용하여
    작업의 상태를 결정할 수 있다.
  • 가장 일반적으로 람다 표현식은 작업이 수행할 작업을 지정하는 데 사용된다.
  • return을 받고싶으면 Task<TResult>사용.
  • build up에 순서가 있지만 원래 async키워드를 쓰려는 과정에서
    이전 요소들을 확실히 쓰고 가고싶어서 이지경이 됐음.

사용

  • 근본
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    class Task_1
    {
        public Task_1()
        {
            Action act = mtd;
    
            Task t = new Task(act);
            t.Start();
            //t.Wait();
        }
    
        void mtd()
        {
            Console.WriteLine("task_1");
        }
    }
    
    • 이렇게하면 암껏도 안하고 끝난다.
      이유는 t.start(); 하고 main은 그대로 진행,
      task는 따로 진행해서 그런가봄.(비동기니까)
      t.wait();를 해야 mtd()까지 실행 한 결과를 볼 수 있다.
      별 다른 일 없으면 짝이라 보자
  • 다른 방법
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    
    class Task_2
    {
        delegate void dele();
    
        public Task_2()
        {
            mtd_1();
        }
    
        void mtd_1()
        {
            Action act_1 = () => { Console.WriteLine("t_1"); };
            Task t_1 = Task.Factory.StartNew(act_1);
            t_1.Wait();
    
            Action<object> act_2 = (object s1) => { Console.WriteLine("{0}", s1); };
            Task t_2 = new Task(act_2, "t_2");
            t_2.Start();
            t_2.Wait();
    
            Task t_3 = Task.Run(() => Console.WriteLine("t_3"));
            t_3.Wait();
    
            Task t_4 = new Task(() => { Console.WriteLine("t_4"); });
            t_4.RunSynchronously();
            t_4.Wait();
    
            Task t_5 = new Task(delegate
            {
                Console.WriteLine("t_5");
            });
            t_5.Start();
            t_5.Wait();
    
            dele del = mtd_2;
            Task t_6 = new Task(new Action(del));
            t_6.Start();
            t_6.Wait(); 
        }
    
        void mtd_2()
        {
            Console.WriteLine("t_6");
        }
    
    }
    
    • t_1
      • 원래 action에서 method를 연결 하는 대신
        저렇게 간단하게 쓰고 이 방법이 처음 설명에서 말하는
        람다식 사용해 표현하는 방법인데 이게 무명메서드인가…
      • 원래 Task.Factory.StartNew(act_1); 요부분을 설명하려던건데
        이건 바로 실행임 .start()가 필요없음
    • t_2
      • parameter를 줘야 할때.
      • 하나밖에 안됨.. Action<obj, obj> 이런식은 못받아줌
        Task parameter에 object로 받는거 state 하나밖에 없음.
        obj라 여러개여도 상관없긴함.
      • 근데 이게 parameter넘길때 쓰는 올바른 방법인지 잘 모르겠음.
    • t_3
      • parameter없고 return 없으면 사용할수 있는 방법
      • 이것도 바로 실행
    • t_4
      • Task t4 is executed synchronously on the main thread
        by calling the RunSynchronously() method.
      • Although the task was run synchronously,
        it is a good practice to wait for it in the event exceptions
        were thrown by the task.
      • 원래 방식으로 main thread에서 실행함.
      • 이 작업에서 발생 된 이벤트 예외에 대기하는 것이 좋다.
    • t_5
      • delegate 사용 1
    • t_6
      • delegate 사용 2
  • 다른 delegate형은 안됨 예를들어
    1
    2
    3
    4
    
    delegate void dele();
    ///    
    dele del = mtd;
    Task ttt = new Task(del);
    

참고

This post is licensed under CC BY 4.0 by the author.

2. Action/Func

4. Task_2

Comments powered by Disqus.