1. async 키워드로 수식된 메서드는 비동기 메서드가 된다.

2. 비동기 메서드 내에서는 적어도 하나의 await 키워드가 있어야한다.

3. async 키워드로 수식된 비동기 메서드가 아니라면 await 키워드를 사용할 수 없다.

4. 이벤드 핸들러가 아닌 비동기 메서드를 만들려면 async 키워드를 지정하고 리턴형을 TaskTask<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);
}

Posted by lI헐헐Il
,