dev

C# ConfigureAwait 이해

재삐신생 2026. 1. 15. 13:43
반응형

C#의 비동기 처리는 아주 사용자 친화적으로 구성되어

편리하게 Task + async/await로 구성할 수 있다.

 

사실 내부 비동기 매커니즘은 복잡한데,

SynchronizationContext와 Managed Thread Pool 등등 살펴볼 필요가 있다.

 

이글의 목적은 ConfigureAwait 를 이해하는것이다.

 

대략 적인 사용법은

await SomeTask().ConfigureAwait(false);

 

같은 방식인데, ConfigureAwait의 역할은 무엇인가??

 

ConfigureAwait(false)

  • “원래 컨텍스트로 돌아오지 말고 아무 데서나(대개 ThreadPool) 이어서 실행해도 됨”
  • 라이브러리 코드에서 데드락 방지/성능에 유리한 경우가 많음
  • UI 업데이트가 필요하면 false 쓰면 안 됨(돌아올 스레드가 보장되지 않음)

 

C#의 Task 구현은 기본적으로

1. await 문법을 사용해서, Task의 실행을 대기

2. 실행시점의 SynchronizationContext or TaskScheduler를 캡쳐,

3. await가 끝난 시점에서는 원래 실행중이었던 쓰레드로 복귀 (Task가 다른 쓰레드에서 실행되더라도)

 

그럼 당연히, Context Switching 비용이 수반되게 된다.

ConfigureAwait(false); 는 이 Context Switching를 하지 않아도 된다고 알리는 것이다.

그럼 Task를 실행하던 쓰레드에서 await 이후의 코드를 계속 실행하게 하므로써, 약간의 성능상 이점이 있다.

 

주의사항은 await 이후 UI 쓰레드가 필요한 작업에서는 사용하면 안됨. ( WinForms , WPF 등 해당됨)

 

UI를 제외한 일반적인 케이스에서는 대부분 권장된다!

 

.net 8 이후 부터는 ConfigureAwaitOptions이 생겼으니, 아래처럼 대체 가능하다.

  • ConfigureAwait(true) ≈ ConfigureAwait(ConfigureAwaitOptions.ContinueOnCapturedContext)
  • ConfigureAwait(false) ≈ ConfigureAwait(ConfigureAwaitOptions.None)

 

반응형

'dev' 카테고리의 다른 글

PHP PDO를 써야하는 이유 중 하나  (0) 2017.06.19
부호확장(sign extension)  (0) 2017.05.10
비트연산시 실수  (0) 2017.05.10
콜백  (0) 2017.05.06
버퍼풀  (0) 2017.05.05