.NET 프레임 워크에서 제공하는 비동기 기능을 처음 사용합니다.
async 키워드가 제공하는 이점은 스레드가 비동기 메서드를 호출 할 때 대기 지점으로 돌아와 제대로 실행을 재개 할 수 있다는 것입니다.
내 질문은 그 지점에서 돌아온 후 스레드가 뭐하는거야? 스레드 풀에서 다른 작업 항목을 실행하는 데 사용할 수 있습니까? 그렇다면 컨텍스트 스위치가 있어야합니다. 그렇지 않다면 왜 거기에 선회하지 않는 것입니까?
===== 그래서 비동기 함수의 완성되지 않은 부분을 차지할 다른 스레드가있을 것입니다.이 상태 스위치는 어떻게 저장됩니까? 다른 스레드는 어떻게 그 상태를 취합니까?
코드가await
표현식 (대기 상태가 동 기적으로 완료되지 않았다고 가정)을 작성하면 마치 호출 한 메소드로 리턴됩니다.return;
.
(그것은Task<T>
호출자가 비동기 부분의 완료를 기다리는 데 사용할 수 있음)
그런 다음 호출 메소드는 실행될 때까지 계속 실행합니다.그것반환 (대개 즉시 반환됩니다.await
반환 된 작업), 호출 스택의 (사용자가 마주 친 부분) 맨 위에 도달 할 때까지 계속됩니다.
호출 스택의 맨 위에 도달하면 해당 스레드는 자연스럽게 수행합니다.
UI 스레드 인 경우 메시지 루프로 돌아가 UI를 계속 응답합니다.
ThreadPool 스레드 (또는 ASP.Net 작업자 스레드) 인 경우 풀로 돌아가서 더 많은 작업을 위해 (동 기적으로) 대기합니다.
"원시"스레드 (콘솔 응용 프로그램의 기본 스레드 또는new Thread()
, 종료됩니다.
Task.ContinueWith()
이것은 클로저처럼 현재 상태를 캡처하는 콜백을 사용합니다. 만나다msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx - SLaks
예, 스레드가 반환하고 다른 작업을 수행 할 수 있습니다.
~에 관해서는why not just spin there
왜냐하면 다른 일을 할 수 있기 때문입니다. 작업을 수행 할 기회가있을 때 스레드가 유휴 상태를 유지하도록 강제 할 필요는 없습니다.
작업을 계속할 스레드가 마음에 들지 않으면 다음과 같이 Task.ConfigureAwait를 사용할 수 있습니다.
await foo.DoSomethingAsync().ConfigureAwait(continueOnCapturedContext: false);
ConfigureAwait()
쓰레드가 다음에 무엇을하는지와 아무 관련이 없습니다. - SLaks