이 질문에는 이미 답변이 있습니다.
필자가 비동기 함수를 기다리고 있다면, 다음 코드는 델리게이트에 래핑되고 비동기 함수가 반환 된 후에 실행됩니다.
async bool Test()
{
await byte[] arr = ReadAsync(....)
// all following code will be wrapped into a delegate
if (arr != null)
{
// Do something
return true;
}
return false;
}
ContinueWith에 다음 코드를 명시 적으로 포함하는 경우와 같습니다.
async bool Test()
{
bool res = await ReadAsync(...)
.ContinueWith(t =>
{
byte[] arr = t.Result;
if (arr != null)
{
// Do something
return true;
}
return false;
});
}
이 두 구현간에 차이점이 있습니까?
시장의 차이점은 호출 한 스레드가await
~에서SynchronizationContext
,await
그 속에서 계속을 계획 할거야.SynchronizationContext
기본적으로. 그래서 기다리고 나면 이전과 같은 스레드에서 돌아올 것입니다. 다음을 사용하여 변경할 수 있습니다..ConfigureAwait(false)
.
와.ContinueWith()
그것은 다른 방법으로 eaxactly 주위에, 당신이 통과하지 않는 한 기본적으로 그것은 스레드 (스레드 풀) 스레드에 예약됩니다TaskScheduler.FromCurrentSynchronizationContext()
그것에.
.Wait()
~ 안에.ContinueWith()
예. 이것은 대답이 설명하는대로 실제 시장 차이입니다. - bitbonk