인터뷰 질문: async &await(C#)

질문: async/await 키워드의 용도는 무엇입니까?
이 키워드들은 동기화 방식으로 비동기 비저항 코드를 작성할 수 있습니다.Task/Task<T> 클래스 또는 ValueTask/ValueTask<T> 패브릭은 이 기능을 단순화합니다.이런 유형들은 다른 방식으로 실행할 수 있는 조작의 추상적인 것을 대표한다.await 키워드를 사용하여 작업을 결과 값으로 구체화했습니다.await을 포함하는 방법은 반드시 async 키워드로 표시해야 한다.
질문: 비동기 프로그래밍과 다중 루틴 프로그래밍은 어떤 차이가 있습니까?
비동기 임무는 반드시 단독 라인에서 집행하는 것을 대표하는 것은 아니다.비동기적인 조작을 두 사건의 집합인 시작과 끝으로 볼 수 있다.
비동기적인 조작의 좋은 예는 하드디스크에서 파일을 읽는 것이다.파일의 바이트를 읽으려면 운영체제가 드라이버 소프트웨어에 요청을 하고 드라이버 소프트웨어는 머신 헤드를 이동해서 드라이브에 특정한 위치를 찾으라고 알립니다.머리를 움직이는 과정은 비동기적이다. CPU에서 실행되는 작업이 아니라, 완성을 기다려야 하는 물리적 작업일 뿐이다.이것은 async/await 모드로 표시할 수 있는'순수한'비동기 조작이다.
비동기식 작업도 단독 라인에서 진행되는 일부 CPU 제한을 나타낼 수 있지만 이것은 세부 사항을 실현하는 것이다.호출이 막히지 않도록 다른 라인에 실행을 의뢰하고 비동기적인 조작으로 위장하기를 원할 때 유용합니다.Task.Run()으로 전화하세요.
전체적으로 말하자면, 모든 다중 루틴의 집행은 하나의 비동기적인 조작을 나타낼 수 있지만, 모든 비동기적인 조작이 반드시 추가적인 루틴을 사용해야 하는 것은 아니다.
물음: 그것은 어떻게 일합니까?
예를 들면 다음과 같습니다.
public async Task DoAsync()
{
    Console.WriteLine("Before await");

    await Task.Delay(TimeSpan.FromSeconds(1));

    Console.WriteLine("Between awaits");

    await Task.Delay(TimeSpan.FromSeconds(1));

    Console.WriteLine("After await");
}
기능상 이 코드의 작업 방식은'대기 전'을 콘솔에 인쇄하고 1초를 기다리며'대기 사이'를 인쇄하고 다시 1초를 기다린 다음에'대기 후'를 인쇄하는 것이다.
첫 번째 await 이전의 모든 조작은 일반적인 방법과 같이 동기화되었다.이것은 '대기 전' 이 방법이 호출된 같은 상하문에서 인쇄된다는 것을 의미합니다.
다음은 정적 조수 방법 Task.Delay()을 사용하여 새로운 작업을 만들고 실행하는 것입니다.이것은 간단한 임무로 아무 일도 하지 않고 지정된 지연 후에 자동으로 완성된다.await 키워드에 도달하면 실행 시 호출 방법에 제어권을 되돌려줍니다. 호출 방법은 기다릴 수도 있고 기다리지 않을 수도 있습니다.만약 그것이 기다리고 있다면, 같은 상황이 다시 발생할 것이다. 이 방법의 호출자에게 제어권을 순차적으로 되돌려주고, 호출 창고에 도착할 때까지 기다리지 않거나, 작업 (예를 들어 컨트롤러 프로그램의 입구점) 을 동기화하는 방법.
작업이 완료된 후(1초 후) 실행은 우리의 방법으로 되돌아와 '대기 사이' 인쇄를 통해 계속됩니다.기본적으로 실행은 이 방법을 실행하기 시작한 상하문과 같은 상하문에서 계속됩니다.
그리고 이야기가 다시 반복되어 새 작업을 실행하고 기다리며 마지막으로 '대기 후' 를 출력합니다.마지막 메시지 이후, 실행은 호출자에게 되돌려줍니다. (만약 DoAsync에서 기다린다면) 계속 실행할 수 있도록 합니다.
물음: 만약 우리가 비동기적인 방법을 실행하지만 그것을 기다리지 않는다면 무슨 일이 일어날까요?
특별한 것은 없습니다. 임무가 대표하는 조작은 정상적으로 생명주기가 계속되지만 결과를 관찰하지 않습니다.작업 대상 자체는 결국 쓰레기 수집기에 회수됩니다..ContinueWith()을 사용하여 결과를 리콜할 수도 있습니다.
물음: 만약 비동기적인 방법에서 이상을 일으킨다면 어떤 일이 일어날까요?
이 방법을 기다리면 전체 체인을 기다리면 이상은 즉시 호출 방법으로 전파되고 이 방법의 호출자에게 전파된다.
그렇지 않으면 이상은 관찰되지 않은 것으로 간주되며, 이것은 (프레임워크의 일부 버전에서) 프로그램이 종결기에서 작업을 처리한 후 바로 붕괴될 수 있습니다.
물음: 비동기적으로 실행되는 lambda를 만들 수 있습니까?
그래.
var result = await new Func<Task>(async () => await Task.Delay(100));
물음: 한 방법이 Task으로 되돌아와 기다리지 않을 때 무슨 일이 일어날까요?
예:
public Task WaitAsync() => SomeOtherMethodAsync();
이 경우 SomeOtherMethodAsync()의 비동기적인 부분에서 이상이 발생하면 WaitAsync() 방법은 창고 추적에 열거되지 않습니다.
질문: Task 유형은 IDisposable을 실현했습니다. 우리는 언제 임무를 처리해야 합니까?Dispose() 방법은 수동으로 호출해서는 안 됩니다. 작업이나 GC 회수 작업을 기다리면 작업이 자동으로 풀립니다.
물음: ConfigureAwait()의 목적은 무엇입니까?
기본적으로, 기다리는 작업이 끝난 후, 최초로 포획된 상하문 (즉 이 방법을 호출한 동일한 라인) 에서 계속 실행됩니다.이 동작을 덮어쓰는 ConfigureAwait(false)을 지정하면 다른 상하문에서 실행할 수 있음을 지시할 수 있습니다.
일반적으로 가능한 한 ConfigureAwait(false)을 사용하는 것을 권장합니다. 왜냐하면 이것은 비교적 작은 성능 이득을 제공할 수 있고 자물쇠가 사라지는 것을 방지하는 데 도움이 되기 때문입니다.
물음: 왜 기본 행동이 포획된 상하문에서 계속됩니까?
Windows UI 및 클래식 ASP를 사용하는 경우 호환성 때문에 제한됩니다.NET 애플리케이션한 가지 경우, 사용자는 자주적인 라인에 오는 컨트롤러와만 상호작용할 수 있고, 다른 한 가지 경우, 요청을 처리하는 같은 라인에서만 응답할 수 있기 때문에, 포획된 상하문에서 계속 실행하는 것이 매우 중요하다.
물음: TaskValueTask 사이에는 어떤 차이가 있습니까?
주요 차이점은 Task은 하나의 종류이고 ValueTask은 하나의 구조이다.일반적으로 동기식으로 반환되는 비동기식 방법(예: 캐시 결과)이 스팸 컬렉터에 미치는 불필요한 압력을 줄이기 위해 BCL에 추가됩니다.ValueTaskTask의 차이점 또는 동기화 결과로 볼 수 있습니다.최근 들어 ValueTaskValueTaskSource이 신호를 보낸 결과를 나타낼 수 있다.
질문: 동기화 방법에 비해 비동기화 방법을 사용하는 주요 단점은 무엇입니까?
비동기적인 방법은 디버깅하기 어려울 수 있습니다. 특히 비동기적인 방법으로 인한 이상은 창고 추적을 읽기 어렵기 때문입니다.그 밖에 긴밀한 순환 속에서 많은 비동기 임무를 운행하면 쓰레기 수집기에 압력을 줄 수 있다.

좋은 웹페이지 즐겨찾기