Windows에서 Environment.TickCountEnvironment.TickCount64 OS에 대한 기본 대기 API에 표시되는 동작과 일치하도록 업데이트되었습니다. 경과 시간 측정에서 더 이상 수면 시간이나 최대 절전 모드 시간을 포함하지 않습니다. 또한 이 변경으로 인해 Windows 동작은 다른 플랫폼에서 볼 수 있는 동작과 일치하며 시스템의 기본 인터럽트 타이머와 동일한 빈도로 업데이트됩니다. 이 변경을 통해 더 높은 빈도 업데이트를 옵트인한 앱에서 응답성이 높아질 수 있습니다.
도입된 버전
.NET 11 미리 보기 1
이전 동작
이전에는 Windows Environment.TickCount64 에서 Win32 GetTickCount64 API의 결과를 반환했는데, 이 API는 고정 주기인 10-16ms(일반적으로 15.5ms)로 업데이트되었으며 시스템이 절전 모드, 최대 절전 모드 또는 기타 저전력 상태에서 보낸 시간을 포함했습니다.
다른 플랫폼(예: Linux 및 macOS) Environment.TickCount64 에서는 시스템의 기본 인터럽트 타이머와 동일한 빈도로 업데이트되고 시스템이 "절전 모드"로 간주되는 시간만 포함되었습니다.
모든 플랫폼에서 Environment.TickCount 잘린 결과를 Environment.TickCount64 반환하고 동일한 동작을 보였지만 약 49일마다 오버플로가 발생했습니다.
새 동작
이제 Windows에서 Environment.TickCount64 Win32 QueryUnbiasedInterruptTime API의 결과를 반환합니다. 이 변경으로 .NET API는 OS에 대한 기본 대기 API에서 사용되는 동작과 인라인으로 제공됩니다. 더 이상 대기 시간은 포함되지 않으며, 시스템의 기본 인터럽트 타이머와 동일한 빈도로 업데이트됩니다.
다른 플랫폼에서는 Environment.TickCount64 Windows의 새 동작과 일치하는 동작을 유지합니다.
모든 플랫폼에서 Environment.TickCount는 Environment.TickCount64의 동작을 반영하며 구현을 유지합니다.
파괴적 변경 유형
이 변경은 동작 변경입니다.
변경 이유
Windows는 Windows 8 및 Windows Server 2012 및 최신 버전에서 유사한 동작 호환성이 손상되는 변경을 수행하여 시간 제한을 수락하는 API(예: SleepEx 및 WaitForMultipleObjectsEx)가 더 이상 깨어 있지 않은 시간을 고려하지 않습니다. .NET과의 불일치는 대기 API가 Environment.TickCount64와 자주 함께 사용되면서 발생하였고, 이는 타이머가 예기치 않게 동작하는 것과 같은 진단하기 어려운 버그를 초래했습니다.
또한 사용된 기본 API인 GetTickCount64는 정확도가 낮고 고정 해상도로만 업데이트되었습니다. OS의 기본 인터럽트 타이머의 빈도가 변경되었을 때, 이 해상도가 조정되지 않아 더 높은 우선순위로 실행되도록 설정된 앱에서 추가 작업이 수행될 수 있었습니다. 이 동작은 macOS 및 Linux와 같은 다른 플랫폼에서 볼 수 있는 동작과도 일치하지 않습니다.
이 변경은 기본 OS 및 플랫폼 간 일관성을 보장합니다. 또한 더 빈번한 업데이트를 옵트인한 앱에서 응답성이 높아질 수 있습니다.
권장 작업
더 높은 빈도 인터럽트 시간을 옵트인하지 않는 한 대부분의 코드는 동작이 변경되지 않아야 합니다. 앱은 이전과 동일한 빈도로 업데이트를 계속 볼 수 있습니다. 그러나 업데이트 빈도와 관련된 경우 시간 제한이 코드의 기대치를 충족하는 올바른 값으로 전달되는지 확인하거나 애플리케이션이 업데이트 빈도를 너무 높게 선택하지 않는지 확인합니다. (이 작업은 현재 P/Invoke API를 통해서만 수행할 수 있습니다.)
일부 코드는 머신이 절전 상태 또는 저전력 상태에서 절전 모드를 해제한 직후에 타이머가 더 이상 실행되지 않는 것을 볼 수 있습니다. 이러한 시간이 관련된 경우 이러한 시간을 항상 포함할 수 있는지 확인하는 등의 DateTime.UtcNow API를 사용합니다. 이러한 코드는 잠재적인 클록 조정을 고려해야 할 수 있습니다.
Windows에서 이러한 변경의 영향을 받는 코드는 이미 Linux 및 macOS와 같은 다른 플랫폼의 동일한 시나리오에 의해 영향을 받을 수 있습니다.
영향을 받는 API
.NET