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()가 필요없음
- 원래 action에서 method를 연결 하는 대신
- 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에서 실행함.
- 이 작업에서 발생 된 이벤트 예외에 대기하는 것이 좋다.
- Task t4 is executed synchronously on the main thread
- t_5
- delegate 사용 1
- t_6
- delegate 사용 2
- t_1
- 다른 delegate형은 안됨 예를들어
1 2 3 4
delegate void dele(); /// dele del = mtd; Task ttt = new Task(del);
Comments powered by Disqus.