0329 Task/async/await
2021. 3. 29. 14:32ㆍC#/수업내용
public class App
{
Thread t;
public App()
{
//Action<object> action = (object obj) =>
// {
// Console.WriteLine("Task {0}, obj {1}, Thread {2}", Task.CurrentId, obj, Thread.CurrentThread.ManagedThreadId);
// };
//Task t1 = new Task(action, "alpha");
//t1.Start();
//t1.Wait();
//Task t2 = Task.Factory.StartNew(action, "beta");
Task t=Task.Run(()=> {
for (int i = 0; i < 100; i++)
{
Console.WriteLine("Test");
Task.Delay(1000);
}
});
t.Wait();
}
}
docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/concepts/async/
await 키워드는 작업을 차단하지 않는 방식으로 시작한 다음, 해당 작업이 완료되면 실행을 계속합니다.
Egg eggs = await FryEggsAsync(2);
Console.WriteLine("eggs are ready");
대부분의 시나리오에서는 독립적인 몇 가지 작업을 즉시 시작하려고 합니다. 그런 다음, 각 작업이 완료되면 준비된 다른 작업을 계속할 수 있습니다.
앞의 메서드에서 해당 시그니처에는 async 한정자가 있습니다. 이 경우 이 메서드에서 비동기 작업이 포함된 await 문을 포함하고 있다고 컴파일러에 알립니다.
static async Task<Toast> MakeToastWithButterAndJamAsync(int number)
{
var toast = await ToastBreadAsync(number);
ApplyButter(toast);
ApplyJam(toast);
return toast;
}
public class Toast
{
public Toast() { }
}
public class Egg
{
public Egg() { }
}
public class App
{
public App()
{
}
public async void Run()
{
Task<Toast> toastTask = MakeToast(2);
Task<Egg> eggTaks = FryEggs(2);
var arr = new Task[] { toastTask, eggTaks }; //일 목록을 만들고
var idx = Task.WaitAny(arr); //목록 중 어떤 것이든 완료되었다면 목록의 index를 반환
Console.WriteLine("idx: {0}", idx); //완료된 인덱스 출력
Console.WriteLine("{0} {1}", toastTask.Result, eggTaks.Result);
//토스트를 만들어 배열에 담고 그 결과를 출력
Toast[] toasts = await Task.FromResult(Enumerable.Range(1, 5).Select(x => new Toast()).ToArray());
foreach (var toast in toasts)
{
Console.WriteLine(toast);
}
}
private async Task<Egg> FryEggs(int howMany)
{
Console.WriteLine("팬을 달굽니다.");
await Task.Delay(3000); //3초 대기
Console.WriteLine($"팬 안에 달걀 {howMany}개를 넣습니다.");
Console.WriteLine("계란을 조리 중입니다.");
await Task.Delay(3000); //3초 대기
Console.WriteLine("계란을 접시에 담습니다.");
return new Egg();
}
private async Task<Toast> MakeToast(int howMany)
{
for (int i = 0; i < howMany; i++) {
Console.WriteLine("토스트기에 빵을 넣었습니다.");
}
await Task.Delay(3000); //3초 대기
Console.WriteLine("빵이 탔습니다.");
await Task.Delay(3000); //3초 대기
Console.WriteLine("빵을 꺼냈습니다.");
return new Toast();
}
}
public class Egg {
public string desc;
public Egg(string desc)
{ this.desc = desc; }
}
public class App
{
public App()
{
//Task 변수 정의 (계란 삶기)
//Task<Egg> taskEgg;
//var egg = new Egg("생달걀");
//Console.WriteLine(egg.desc);
//Task 객체 생성 (일 정의)
//taskEgg = this.BoilEgg(egg);
//일 시작 > 일 끝날 때까지 대기
Task<Egg> taskEgg = this.CookEgg(new Egg("생달걀"));
taskEgg.Wait();
//결과 확인
Console.WriteLine(taskEgg.Result.desc);
}
public async Task<Egg> CookEgg(Egg egg)
{
var boilEgg=await BoilEgg(egg);
return await SeasonEgg(boilEgg);
}
private async Task<Egg> BoilEgg(Egg egg)
{
Console.WriteLine("달걀을 삶기 시작합니다.");
await Task.Delay(1000);
egg.desc = "삶은 달걀";
Console.WriteLine("달걀이 삶아졌습니다.");
return new Egg(egg.desc);
}
private async Task<Egg> SeasonEgg(Egg egg)
{
Console.WriteLine("달걀에 소금을 뿌립니다.");
await Task.Delay(1000);
egg.desc = "양념된 삶은 달걀";
return egg;
}
}
'C# > 수업내용' 카테고리의 다른 글
0326 스레드 (0) | 2021.03.26 |
---|---|
0326 쿠키런 직렬화/역직렬화 (0) | 2021.03.26 |
0325 싱글턴 패턴 (0) | 2021.03.25 |
0324 File 클래스 (외부 파일 불러오기) (0) | 2021.03.24 |
0324 복습 (0) | 2021.03.24 |