1. async 키워드로 수식된 메서드는 비동기 메서드가 된다.
2. 비동기 메서드 내에서는 적어도 하나의 await 키워드가 있어야한다.
3. async 키워드로 수식된 비동기 메서드가 아니라면 await 키워드를 사용할 수 없다.
4. 이벤드 핸들러가 아닌 비동기 메서드를 만들려면 async 키워드를 지정하고 리턴형을 Task나 Task<TResult>로 지정한다.
private long DoSomething() { var sw = Stopwatch.StartNew(); Thread.Sleep(8000); sw.Stop(); return sw.ElapsedMilliseconds; } private async void btnExecute1_Click(object sender, EventArgs e) { toolStripStatusLabel1.Text = ""; var elapsed = await Task.Run(() => DoSomething()); toolStripStatusLabel1.Text = "완료 : " + elapsed.ToString(); } private async Task<long> DoSomethingAsync() { var sw = Stopwatch.StartNew(); await Task.Delay(1000); sw.Stop(); return sw.ElapsedMilliseconds; } private async void btnExecute2_Click(object sender, EventArgs e) { toolStripStatusLabel2.Text = ""; var elapsed = await DoSomethingAsync(); toolStripStatusLabel2.Text = "완료 : " + elapsed.ToString(); }
여러 개의 비동기 작업을 수행할 때는 List<Task> 객체를 사용할 수 있다.
var eggsTask = FryEggsAsync(20); var baconTask = FryBaconAsync(3); var toastTask = MakeToastWithButterAndJamAsync(2); var breakfastTasks = new List<Task> { eggsTask, baconTask, toastTask }; while (breakfastTasks.Count > 0) { Task finishedTask = await Task.WhenAny(breakfastTasks); if (finishedTask == eggsTask) { Console.WriteLine("eggs are ready"); } else if (finishedTask == baconTask) { Console.WriteLine("bacon is ready"); } else if (finishedTask == toastTask) { Console.WriteLine("toast is ready"); } breakfastTasks.Remove(finishedTask); }