0

이 질문에는 이미 답변이 있습니다.

필자가 비동기 함수를 기다리고 있다면, 다음 코드는 델리게이트에 래핑되고 비동기 함수가 반환 된 후에 실행됩니다.

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;
                    });
}

이 두 구현간에 차이점이 있습니까?


  • 포스터에 추가 사본이 있기 때문에이 사본이 중복이라고 정말로 말할 수 없습니다..Wait()~ 안에.ContinueWith()예. 이것은 대답이 설명하는대로 실제 시장 차이입니다. - bitbonk

1 답변


4

시장의 차이점은 호출 한 스레드가await~에서SynchronizationContext,await그 속에서 계속을 계획 할거야.SynchronizationContext기본적으로. 그래서 기다리고 나면 이전과 같은 스레드에서 돌아올 것입니다. 다음을 사용하여 변경할 수 있습니다..ConfigureAwait(false).

.ContinueWith()그것은 다른 방법으로 eaxactly 주위에, 당신이 통과하지 않는 한 기본적으로 그것은 스레드 (스레드 풀) 스레드에 예약됩니다TaskScheduler.FromCurrentSynchronizationContext()그것에.


  • 감사. 구현 세부 사항 차이 외에 구현에 사용해야하는 성능 영향이나 연습 제안이 있습니까? - codewarrior
  • @codewarrior 이것은 구현 코드와 작동하지 않는 코드의 차이를 만들 수있는 프로그래머라고 생각해야하는 "구현 세부 사항 차이"가 아닙니다. 비 작동 코드). - user743382

연결된 질문


관련된 질문

최근 질문