1 minute read

동기 비동기의 개념 및 사용처

동기
일반적인 처리로 예를들어 A라는 작업이 끝난 후 B라는작업, C라는 작업 등 순차적으로 작업을 수행, 작업이 완료될 때 까지 대기해야하는 처리방식입니다.

비동기
간단히 말해 병렬 처리로, A라는 작업을 요청한뒤, 결과를 기다리지 않고 다음 동작인 C작업을 하는것을 의미합니다.
요청한 작업이 완료될 때 별도로 확인을 해야 하지만 작업이 오래 걸린다 하더라도 다른 작업을 계속할 수 있기 때문에 효율적인 작업이 가능합니다.

사용처

  • 게임중 용량이 큰 파일(동영상 등등)을 로드할 때
  • SDK나 기타 필요 라이브러리 등을 처음 로드할 때
  • 순서가 확실하게 정해져 있는 작업을 할 때


C++에도 동기 비동기를 사용할 수 있으며,
C#과는 달리 std::promise , std::future 이 두가지를 사용하여 동기 비동기처리를 할 수 있습니다.

C++에서 사용하는 동기 비동기 -> C++ 동기 비동기


사용법


C#에서 동기 처리를 하기위해서는 아래의 2가지 키워드를 알고 있어야합니다.

async // await키워드를 Method내에서 사용 할 수 있게 만들어주는것
await // 비동기 처리의 흐름을 제어하는 키워드로 실질적인 비동기 작업이 실행되는곳 입니다


async void이렇게도 사용할 수 있으나, 이렇게 사용하면 비동기 메서드를 호출하는 쪽에서 비동기 제어할 수 없으니 가급적 사용하지 않으시기를 추천드립니다.
(다만, 종종 UI버튼 이벤트 등 이벤트 핸들러로 사용할 때 void를 사용하곤 합니다.)

사용 예시

public async void TestAsync()
{
 
}

public async Task TestAsync()
{
	await Task.Delay(1000);
}

public async Task<int> TestAsync()
{
	await Task.Delay(1000);
	return 1;
}


전체적인 코드에서 사용법 예시 입니다.
아래에서 보시다시피 Main스레드에서는 TestAsync를 호출하고 await Task.Delay(5000); 를 실행하여 내부 타이머를 사용해 스레드 풀의 큐에 들어가게 됩니다.
메인 스레드는 약 5초뒤 await Task.Delay(5000); 작업이 끝나면 스레드 풀에 있는 잉여 스레드가 End TestAsync를 출력합니다.


비동기 처리 사용 코드

using System;
using System.Threading.Tasks;

public class Program
{
    public static void Main(string[] args)
    {
        TestAsync();
        Console.WriteLine("End Main, Stand by TestAsync");
    }

    public static async void TestAsync()
    {
        await Task.Delay(5000);
        Console.WriteLine("End TestAsync");
    }
}


동기 처리 사용 코드

using System;
using System.Threading.Tasks;

public class Program
{
    public static void Main(string[] args)
    {
        TestAsync();
        Console.WriteLine("End Main, Stand by TestAsync");
    }

    public static void TestAsync()
    {
        Task.Delay(5000);
        Console.WriteLine("End TestAsync");
    }
}


여기서 5초를 기다리지 않고 End TestAsync 가 출력 된 이유는 Task.Delay(5000); 의 반환값인 5초 대리 작업을 await하지 않았기 때문입니다. Task를 await하지 않았기 때문에 프로그램은 5초를 기다리는 작업이 완료 되는것을 기다리지 않고 계속 실행 합니다.


Top