Task.ConfigureAwait 메서드
public System.Runtime.CompilerServices.ConfiguredTaskAwaitable
ConfigureAwait (bool continueOnCapturedContext);
public System.Runtime.CompilerServices.ConfiguredTaskAwaitable
ConfigureAwait (System.Threading.Tasks.ConfigureAwaitOptions options);
Task.ConfigureAwait는 사용하면 비동기 작업의 실행 컨텍스트를 제어하여 UI응답성을 향상시키고
데드락을 피하며 성능을 최적화 할 수 있다
비동기 작업이 완료 된 후에 이어지는 코드 블록이
어떤 스레드 컨텍스트에서 실행 되어야 하는지를 제어한다
주로 UI 응용 프로그램에서 사용되고, 특히 UI 스레드에서 비동기 작업이 실행 중인 경우
UI 스레드에 다시 돌아가서 UI를 업데이트를 해야할 때 유용하다
public async Task DoSomethingAsync()
{
// 비동기 작업을 수행합니다.
await SomeAsyncOperation().ConfigureAwait(false);
// 여기서 다음 코드가 다른 스레드에서 실행됩니다.
UpdateUI();
}
ConfigureAwait(false)를 사용해서 작업이 완료된 후에도
스레드 컨텍스트를 변경하지 않고 계속 해서 백그라운드 스레드에서 실행 하도록 지정 할 수 있다
위의 코드 같은 경우, SomeAsyncOperation() 가 완료된 후에 UpdateUI() 가 다른 스레드에서 실행되도록 해준다
ConfigureAwaite(false) 와 ConfigureAwaite(true) 의 차이
두개의 차이는 비동기 작업이 완료된 후에 이어지는 코드가 실행되는 컨텍스트에 차이가 있다
ConfigureAwaite(true)는 기본값이고 대부분의 경우에는 생략 할 수 있다
비동기 작업이 완료된 후에 이어지는 코드는 호출된 컨텍스트(주로 호출된 스레드)에서 실행됨
주로 UI 업데이트나 호출된 스레드에 대한 동기화가 필요한 경우에 사용된다
// ConfigureAwait(true)를 사용한 경우
public async Task DoSomethingAsync()
{
// 비동기 작업을 수행합니다.
await SomeAsyncOperation().ConfigureAwait(true);
// 여기서 다음 코드는 호출된 스레드에서 실행됩니다.
UpdateUI();
}
ConfigureAwaite(false)는 비동기 작업이 완료된 후에 이어지는 코드가 현재 컨텍스트와 동립적으로 실행된다
주로 CPU 바운드 또는 긴 시간이 소요되는 작업에서 사용된다
UI와는 무관한 백그러운드 스레드에서 작업을 수행하고자 할 때 유용하다
UI 응답성을 향상시키는데 도움이 된다 UI 스레드를 차단하지 않고 비동기 작업을 수행하고
작업이 완료된 후에 UI를 업데이트 할 수 있다
// ConfigureAwait(false)를 사용한 경우
public async Task DoSomethingAsync()
{
// 비동기 작업을 수행합니다.
await SomeAsyncOperation().ConfigureAwait(false);
// 여기서 다음 코드는 호출된 스레드와 관계없는 다른 스레드에서 실행됩니다.
UpdateUI();
}