C#의 비동기 프로그래밍 지원은 고성능, 응답성이 중요한 애플리케이션 개발을 간소화하는 강력한 도구를 제공한다. 이를 가능하게 하는 주요 요소는 async와 await 키워드를 중심으로 한 Task 기반 비동기 프로그래밍 모델(TAP, Task-based Asynchronous Pattern)이다.
동기(Synchronous) 방식의 코드는 코드가 실행되고 다음코드 실행되고 그다음코드 실행되고의 방식이다. 메서드를 호출한 이후 그 메서드가 완료될 때까지 코드 실행이 차단된다.
작업은 순서대로 실행되어 하나의 작업이 끝날 때까지 다른 작업을 수행하지 않고 작업이 완료될 때까지 기다리게 되므로 프로그램이 멈추게된다.
네트워크 요청, 데이터베이스 조회 등 시간이 오래걸리는 작업이라면 비효율적이 된다.
길을 걷다가 핸드폰을 보기 위해 제자리에 서서 핸드폰을 확인하고 다시 걷는다.
비동기(Asynchronous) 프로그래밍은 코드1, 코드2, 코드3의 순서로 작성된 코드들이 서로 끝나는 것을 기다리지 않고 실행하난 방식이다. 코드들은 먼저 완료가 된 순서대로 결과를 반환하며 메서드를 호출한 이후 해당 메서드가 완료되기를 기다리지 않고 다름 코드를 실행한다.
비동기 메서드는 백그라운드 스레드처럼 긴 시간이 소요되는 작업에서 수행되므로, 메인 스레드(ui및 이벤트처리 등의 프로그램의 중요한 처리)는 다른 작업을 수행할 수 있다.
핸드폰을 보며 길을 걸어갈 수 있다.

namespace asynchronous
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void RunAnything(Label lbl)
{
for (int i = 0; i < 50; i++)
{
Thread.Sleep(50);
lbl.Text = i.ToString();
lbl.Refresh();
}
}
private void btnWalking_Click(object sender, EventArgs e)
{
RunAnything(lblWalking);
}
private void btnPhone_Click(object sender, EventArgs e)
{
RunAnything(lblPhone);
}
private void btnTalking_Click(object sender, EventArgs e)
{
RunAnything(lblTalking);
}
}
}

버튼을 누르면 해당버튼의 우측에 있는 lable이 카운트된다.

걷기버튼을 누르면 lable1이 카운트된다.
걷기버튼이 동작하고 있는 도중에 휴대폰보기 버튼을 눌러도 동작하지 않는다.

걷기버튼이 끝난 후 작동한다. 이것이 동기이다.
namespace asynchronous
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// 비동기
private async void RunAnythingAsync(Label lbl)
{
for (int i = 0; i < 50; i++)
{
await Task.Delay(50);
lbl.Text = i.ToString();
lbl.Refresh();
}
}
private void btnWalking_Click(object sender, EventArgs e)
{
RunAnythingAsync(lblWalking);
}
private void btnPhone_Click(object sender, EventArgs e)
{
RunAnythingAsync(lblPhone);
}
private void btnTalking_Click(object sender, EventArgs e)
{
RunAnythingAsync(lblTalking);
}
}
}

걷기가 50 가기도 전에 휴대폰보기를 누르면 작동이 된다.