나는 혼란스러워. 한 명 또는 여러 명은 어떻게 할 수 있습니까?Task
단일 스레드에서 병렬로 실행합니까? 내 이해병행분명히 틀렸다.
MSDN의 비트 머리를 감쌀 수 없습니다.
async 및 await 키워드로 인해 추가 스레드가 발생하지 않습니다. 만들어진. 비동기 메서드는 다중 스레드를 필요로하지 않습니다. 비동기 메서드가 자체 스레드에서 실행되지 않습니다. 이 메서드는 현재 실행됩니다. 동기화 컨텍스트를 사용하고 스레드에서 시간을 사용하는 경우에만 메서드가 활성화되어 있습니다.
.. 그리고 :
작업 시작과 대기 사이에 다른 작업을 시작할 수 있습니다. 추가 작업은 암시 적으로 병렬로 실행되지만 추가 작업은 수행되지 않습니다. 스레드가 생성됩니다.
그들은 병렬로 작동하지 않으며, 교대로 작동합니다. 실행중인 작업에 대한 진행이 차단되면 상태를 저장하고 준비된 작업에 제어 권한을 부여합니다. 진정한 병렬 처리가 아니라 협업 멀티 태스킹입니다.
스레드는 샘플 원칙에 따라 작동합니다. 그러나 강조하고 싶은 몇 가지 중요한 차이점이 있습니다.
첫째,async
/await
OS 스레드가 아닙니다.
둘째, 행동의 차이 :
async
/await
협업 멀티 태스킹을 사용하면 Win32 스레드는 선제를 사용합니다. 따라서 모든 블로킹 작업은 명시 적으로 컨트롤을 생성해야합니다.async
/await
모델. 그래서 당신은 모든 쓰레드와 모든 태스크를 블로킹하도록 만들 수 있습니다.Stephen이 의견에서 지적한 것처럼양철통다중 스레드 동기화 컨텍스트를 사용하는 경우 여러 OS 스레드에서 동시 실행을 얻습니다 (모든 복잡성 및 잠재적 경쟁 조건과 함께). 그러나 MSDN 인용문은 단일 스레드 상황에 관한 것입니다.
마지막으로,이 동일한 패러다임이 사용 된 다른 장소, 좋은 연습에 대해 많은 것을 배울 수 있습니다.async
/await
이것들을 연구함으로써 :
async
메서드는 차단 될 때 상태와 항복을 저장합니다.~에await
. 차단 코드가 실행중인 경우 (예 :Thread.Sleep
), 그 상태와 수익률을 저장하지 않습니다. - Stephen Clearyawait SomeMethodAsync()
AWAIT 때문에 새 스레드를 만들지 않습니다. SomeMethodAsync가 새 스레드를 만드는 경우 새 스레드가 생성됩니다 (반드시 수행하지는 않음). - igrimpeasync
단일 스레드 내에서 실행되는 메소드SynchronizationContext
(예 : UI 컨텍스트). 콘솔 앱이나 백그라운드 스레드에서 실행되는 경우Task
스레드 풀에서 실행되며의지여러 스레드에서 병렬로 실행하십시오.await
각각 하나씩. - Stephen Cleary