서버 측 코드 (예 : 일부 ApiController
)가 있고 함수가 비동기 적이므로 반환 Task<SomeObject>
되는 경우 언제든지 호출하는 함수를 기다리는 것이 가장 좋습니다 ConfigureAwait(false)
.
스레드 컨텍스트를 원래 스레드 컨텍스트로 다시 전환 할 필요가 없으므로 성능이 뛰어납니다. 그러나 ASP.NET Web Api를 사용하면 요청이 하나의 스레드에 들어오고 함수 ConfigureAwait(false)
의 최종 결과를 반환 할 때 다른 스레드에 잠재적으로 영향을 줄 수있는 함수 및 호출 이 대기 ApiController
합니다.
아래에서 내가 말하는 것에 대한 예제를 작성했습니다.
public class CustomerController : ApiController
{
public async Task<Customer> Get(int id)
{
// you are on a particular thread here
var customer = await SomeAsyncFunctionThatGetsCustomer(id).ConfigureAwait(false);
// now you are on a different thread! will that cause problems?
return customer;
}
}
HttpContext.Current
는 ASP.NET에 의해 흐릅니다. ASP.NETSynchronizationContext
에서는 기본적으로 흐르지await
만,에 의해 흐르지 않습니다ContinueWith
. OTOH, (보안 제한 포함) 실행 컨텍스트는 C #을 통해 CLR에서 언급 한 상황이며, 그것은 되어 모두 흘러ContinueWith
와await
(당신이 사용하는 경우에도ConfigureAwait(false)
).