본문 바로가기

Programming/C#

c# - Await / Async를 이용한 비동기 처리

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;
    }
}

'Programming > C#' 카테고리의 다른 글

c# - Linq  (0) 2017.01.03
c#에서 람다식  (0) 2017.01.03