Await / Async 를 이용한 비동기 처리
비동기처리는 하나의 작업을 실행한 후에 해당 작업이 완료되기를 기다리지 않고 다른 작업을 병행 처리한다는 의미입니다.
다음은 웹사이트를 호출하고 응답을 읽는 코드입니다. 동기식 코드와 비동기식 코드를 비교합니다.
// 동기식 처리
WebClient client = new WebClient();
string res = wc.DownloadString(“http://www.test.com”);
// 비동기 처리
WebClient client = new WebClient();
string res = await client.DownloadStringTaskAsync(“http://www.test.com”);
비동기 호출 병렬처리
병렬로 비동기 호출을 실행함으로서 여러개의 작업을 동시에 실행하여 전체 작업시간을 동기식 처리보다 줄 일 수 있습니다.
// 동기식 처리
static void Main(string[] args)
{
int result_1 = AddSome();
int result_2 = AddSome();
// 총작업 시간은 6초가 걸림
}
private static void AddSome()
{
// do something
// 3초간의 작업 수행
}
// 비동기 병렬 처리
static void Main(string[] args)
{
int result_1 = AddSomeAsync();
int result_2 = AddSomeAsync();
Task.WaitAll(result_1, result_2);
// 모든 작업이 끝날때 까지 대기
}
private static Task<int> AddSomeAsync()
{
return Task.Factory.StartNew(() =>
{
Thread.Sleep(3000);
return 7;
}
}
// Await를 이용한 비동기 병렬 처리
static void Main(string[] args)
{
// await 를 이용하여 작업을 실행하였으므로 해당 작업들이 완료될때까지 다른 작업을 수행할 수 있다.
ExecuteAsyncTasks();
}
private static async void ExecuteAsyncTasks()
{
int result_1 = AddSomeAsync();
int result_2 = AddSomeAsync();
await Task.WhenAll(result_1, result_2);
}
private static Task<int> AddSomeAsync()
{
return Task.Factory.StartNew(() =>
{
Thread.Sleep(3000);
return 7;
}
}