Task.Delay는 I / O 작업과 같은 진정한 비동기식입니다. 즉, 스레드 대신 하드웨어 및 인터럽트에 의존합니까?
나는 덤불 주위를 모두 뛰는 수많은 관련 콘텐츠를 발견했으며 답을 찾지 못했습니다. Task.Delay(int)
스레드를 사용하지 않는 것은 거의 100 % 확신합니다. 16 개의 논리 프로세서만으로이 코드를 컴퓨터에서 실행할 수 있기 때문입니다.
var tasks = new List<Task>();
for(int i = 1; i < 100000; i++) tasks.Add(Task.Delay(10000));
await Task.WhenAll(tasks);
완료하는 데 10 초가 걸립니다. 대략 10 만 개의 스레드를 사용한다면 꽤 오래 걸릴 것이라고 생각합니다.
제 질문은 어떻게 Task.Delay(int)
작동합니까? 이 잘못된 권한의 SO 질문이 나타내는 방식 이 아니라 스레딩 및 하드웨어 리소스 관점에서 볼 수 있습니다.
답변
현재 .NET 구현에는 관리되는 타이머 인스턴스를 추적하고 적절한 시간에 이벤트를 발생시키는 단일 "타이머 스레드"가 있습니다. 이 타이머 스레드는 제한 시간이 다음 타이머의 마감 시간으로 설정된 제어 신호를 차단 합니다. 제어 신호는 타이머를 추가 / 제거 / 변경하는 데 사용되므로이 차단 요청이 시간 초과되면 타이머 스레드는 다음 타이머가 실행되었음을 인식합니다. 이것은 정상적인 스레드 차단 작업이므로 내부적으로 스레드는 유휴 상태이며 차단 작업이 완료되거나 시간이 초과 될 때까지 스케줄러 대기열에서 제거됩니다. 이러한 작업의 시간 초과는 OS 스케줄러의 타이머 인터럽트에 의해 처리됩니다.
기술적으로는 스레드가 있지만 프로세스 당 하나의 스레드 만 있고 Task.Delay
.
나는 이것이 현재 .NET 구현 에 있음을 다시 강조합니다 . CPU 당 하나의 타이머 스레드 또는 동적 타이머 스레드 풀과 같은 다른 솔루션이 제안되었습니다. 아마도 그들은 어떤 이유로 실험을했고 거절 당했거나 미래에 대체 솔루션이 채택 될 것입니다. AFAIK 이것은 공식적으로 어디에도 문서화되어 있지 않으므로 구현 세부 사항입니다.