ConfigureAwait??
- C#μμ
TaskλλTask<T>κ°μ²΄μμ νΈμΆν μ μλ λ©μλ- λμ
Taskμ λν΄awaitμ΄ μνλλ λ°©μμ μ μν λ μ¬μ© continueOnCapturedContextλΌλbooleanνμ μ νλΌλ―Έν°κ° μμ- true:
awaitμ΄ν μμ μ μλ μμ μ΄ μ€νλ 컨ν μ€νΈ(context)μμ κ³μ μ€ν - false: λμΌ μ»¨ν
μ€νΈλ₯Ό μ μ§νμ§ μκ³
awaitμ΄ν μμ μ΄ λ€λ₯Έ μ€λ λμμ μ€νλ μ μμ
- true:
- λμ
// ConfigureAwait(true)κ° λν΄νΈ
await SomethingAsync();
await SomethingAsync().ConfigureAwait(true);
// λ°λΌμ μλμ²λΌ falseλ₯Ό μ£Όλ λ§λλκ° κ΄κ±΄
await SomethingAsync().ConfigureAwait(false);
Context??
- μ€ν μ€μΈ μ€λ λμ μ°κ΄λ μν, νκ²½ λ±μ λνλ΄λ μΆμν
- μ€λ λκ° μ΄λ€ μμ μ μνν λμ νκ²½μ μλ―Ένλ©°, μ΄ νκ²½μλ μ€λ λμ μνλ μ€μ λ±μ΄ ν¬ν¨λ¨
- μμ
- UI μ ν리μΌμ΄μ : μ΄ λμ 컨ν μ€νΈλ μ£Όλ‘ UI thread λ° μ΄λ²€νΈ 루νκ° λ¨
- ASP .NET: μ΄ λ 컨ν μ€νΈλ μ£Όλ‘ HTTP μμ²κ³Ό ν΄λΉ μμ² μ²λ¦¬μ κ΄λ ¨λ μνκ° λ¨
μ€μν μ΄μ
awaitμ΄ μ¬λ¬ μν©κ³Ό 컨ν μ€νΈμμ μ΄λ»κ² λμν μ§λ₯Ό μ μ΄ν΄ μ±λ₯μ΄λ μ νμ±λ±μ μ΅μ ννλ λ° νμ©λλ€
trueμ κ²½μ°
- λν΄νΈ λμ λ°©μ
awaitλ μμ μ΄ μμλ λ νμ¬ μ»¨ν μ€νΈλ₯Ό μΊ‘μ²νκ³ , μμ μ΄ μλ£λλ©΄ μΊ‘μ²λ 컨ν μ€νΈμμ νμ μμ μ μ΄μ΄μ μ€νν΄ λκ°λ€.- μ°μλ μμ μ΄ λμΌν μν λλ 리μμ€μ μ κ·Όν μ μλλ‘ λ³΄μ₯ν΄μ€
- λ¬Έμ μ
- λ°λλ½: λ§μ½ μΊ‘μ²λ 컨ν
μ€νΈκ°, μμ
μλ£μ μμ‘΄νλ λ€λ₯Έ λμμ μν΄ blockλλ€λ©΄ λ°λλ½μ΄ λ°μν μ μμ
- UI μ€λ λκ° UI μ€λ λμμ λ€μ μ€νλΌμΌ νλ μμ μ λκΈ°μ μΌλ‘ κΈ°λ€λ¦¬λ κ²½μ°
- μ±λ₯: μΊ‘μ²λ 컨ν
μ€νΈκ° UI μ€λ λκ±°λ μ€λ λ νμ μ€λ λμΈ κ²½μ°, μΊ‘μ²λ 컨ν
μ€νΈμμ μμ
μ μ¬μ€ν νλ κ²μ 컨ν
μ€νΈ μ€μμΉμ μ λ°ν μ μμ
- UI μ€λ λκ° λ€λ₯Έ μ΄λ²€νΈλ₯Ό μ²λ¦¬νλλΌ λ°μ μν©μ΄λΌλ©΄, μ²λ¦¬κ° λλ λ κΉμ§ λκΈ°ν΄μΌ ν¨
- νμ₯μ±: μΊ‘μ²λ 컨ν
μ€νΈκ° μ²λ¦¬ν μ μλ μμ
λμ μ νμ΄ μλ κ²½μ°, λ무 λ§μ μμ
μ΄ ν΄λΉ 컨ν
μ€νΈμμ μ¬κ°λλ©΄ 리μμ€ κ³ κ°λ‘ μλ΅μ±μ΄ μ νλ μ μμ
- ASP.NETμμ μμ²μ μ²λ¦¬ν μ μλ μ€λ λ μκ° κ³ μ λμ΄ μλ€λ©΄, λ무 λ§μ μ°μ μμ μ ν΄λΉ μ€λ λμμ μ¬κ°νλ©΄ μ²λ¦¬λμ΄ μ€μ΄λ€κ³ μ§μ° μκ°μ΄ μ¦κ°ν μ μμ
- λ°λλ½: λ§μ½ μΊ‘μ²λ 컨ν
μ€νΈκ°, μμ
μλ£μ μμ‘΄νλ λ€λ₯Έ λμμ μν΄ blockλλ€λ©΄ λ°λλ½μ΄ λ°μν μ μμ
falseμ κ²½μ°
- awaitκ° νμ¬ μ»¨ν μ€νΈλ₯Ό μΊ‘μ²νκ±°λ λμΌν 컨ν μ€νΈμμ μ¬κ°νμ§ μλλ‘ νκ³ , λμ μ¬μ© κ°λ₯ν μμμ μ€λ λμμ μ¬κ°νλλ‘ μ§μ
- νΉμ μν©μμ μ±λ₯ ν₯μ, νμ₯μ±, λ°λλ½ ννΌμ κ°μ μ΄μ μ μ·¨ν μ μμ
- λ¬Έμ μ
- μ°μλ μμ μμ μλ 컨ν μ€νΈμ κ·Έ μνμ μ κ·Όν μ μκ² λλ―λ‘, 컨ν μ€νΈμ μμ‘΄νλ 리μμ€λ μ½λκ° μμ κ²½μ° λ¬Έμ κ° λ°μν μ μμ
μ΄λ»κ² μ¬μ©νλ κ²μ΄ μ’μκΉ
trueμ κ²½μ°
- μ°μλ μμ
μμ μ€λ¦¬μ§λ 컨ν
μ€νΈ λλ μνμ μ κ·Όν νμκ° μμ λ
- μλ₯Ό λ€μ΄,
awaitμ΄ν UIλ₯Ό μ λ°μ΄νΈνκ±°λ UIμ μμ‘΄μ μΈ λ¦¬μμ€μ μμΈμ€ν νμκ° μμ λ
- μλ₯Ό λ€μ΄,
falseμ κ²½μ°
- μ°μ μμ
μμ μ€λ¦¬μ§λ 컨ν
μ€νΈ λλ μνμ μ κ·Όν νμκ° μμ λ
- μλ₯Ό λ€μ΄, νΉμ 컨ν μ€νΈμ μμ‘΄μ μ΄μ§ μμ CPU λλ I/O μμ
μ£Όμ μ¬ν
λΌμ΄λΈλ¬λ¦¬λ μ¬μ¬μ© κ°λ₯ν μ»΄ν¬λνΈλ₯Ό κ°λ°νλ κ²½μ°
- UI λλ λΉ-UI μ ν리μΌμ΄μ μμ λͺ¨λ μ¬μ©ν μ μλ λΌμ΄λΈλ¬λ¦¬λ μ»΄ν¬λνΈλ₯Ό μμ±ν λλ νΉλ³ν μ΄μ κ° μλ ν ConfigureAwait(false)λ₯Ό μ¬μ©
- μ¬μ©μμ 컨ν μ€νΈλ μ½λ μ¬μ© λ°©μμ λν λΆνμν μ μ½μ΄λ κ°μ μ νμ§ μκ³ μ½λλ₯Ό μμ±ν μ μμ
ASP.NET μ ν리μΌμ΄μ μ κ²½μ°(λλ synchronization contextμ μ¬μ©νλ μ ν리μΌμ΄μ )
- ConfigureAwait(false)λ₯Ό μ¬μ©μ μ μ
- μ°μ μμ μμ HttpContext.Currentλ λ€λ₯Έ μμ²λ³ μνμ μ κ·Όνλ κΈ°λ₯μ΄ μλλλ‘ λμνμ§ μμ μ μμ
- 컨νΈλ‘€λ¬λ νΈλ€λ¬μμ λκΈ° μ½λμ λΉλκΈ° μ½λλ₯Ό νΌν©ν΄ μ¬μ©ν κ²½μ° ConfigureAwait(false)λ₯Ό μ¬μ©νλλΌλ κ΅μ°© μνλ₯Ό μ λ°ν μ μμ
λΉλκΈ° μ½λμ λ¨μ ν μ€νΈλ₯Ό μμ±νλ κ²½μ°
- νΉλ³ν μ΄μ κ° μλ ν ConfigureAwait(false)λ₯Ό μ¬μ©νμ§ μμ
- ν μ€νΈκ° μ€μ μ€ν νκ²½μμ μλν 컨ν μ€νΈμ λμΌν λ°©μμΌλ‘ μ€νλλλ‘ λ³΄μ₯ν μ μκ³ , ConfigureAwait(false)λ₯Ό μ¬μ©νλ©΄ νΉμ 컨ν μ€νΈμμλ§ λ°μνλ μ μ¬μ μΈ λ¬Έμ λ λ²κ·Έλ₯Ό λ°κ²¬νμ§ λͺ»ν μ μμ