Aracılığıyla paylaş


Environment.TickCount, Windows zaman aşımı davranışıyla tutarlı hale getirildi

Windows'ta Environment.TickCount ve Environment.TickCount64 işletim sistemi için temel bekleme API'lerinde görülen davranışla tutarlı olacak şekilde güncelleştirildi. Bunlar artık ölçülen sürenin bir parçası olarak uyku veya hazırda bekleme süresi içermez. Bu değişiklik, Windows davranışını diğer platformlarda görülen davranışla tutarlı hale getirir ve sistemin temel kesme zamanlayıcısıyla aynı sıklıkta güncelleştirilmesini sağlar. Bu değişiklik, daha yüksek sıklık güncelleştirmelerini kabul eden uygulamalarda daha yüksek yanıt verme olanağı sağlar.

Sürüm kullanıma sunulmuştur

.NET 11 Önizleme 1

Önceki davranış

Daha önce Windows'da, Environment.TickCount64 10-16ms (genellikle 15,5ms) sabit temposunda güncelleştirilen ve sistemin uyku, hazırda bekleme veya diğer düşük güç durumlarında harcadığı süreyi içeren Win32 GetTickCount64 API'sinin sonucunu döndürdü.

Diğer platformlarda (Linux ve macOS gibi), Environment.TickCount64 sistem için temel kesme süreölçeri ile aynı sıklıkta güncelleştirildi ve yalnızca sistemin "uyanık" olarak kabul edildiği zamanı içeriyordu.

Tüm platformlarda, Environment.TickCountEnvironment.TickCount64'in kesilmiş sonucunu döndürdü ve aynı davranışı sergiledi, ancak yaklaşık her 49 günde bir taşmaya maruz kalıyordu.

Yeni davranış

Windows'da artık Environment.TickCount64 Win32 QueryUnbiasedInterruptTime API'sinin sonucunu döndürür. Bu değişiklik, .NET API'sini işletim sistemi için temel bekleme API'lerinde kullanılan davranışla aynı hizaya getirir. Artık uyanmamış zamanları içermiyor ve sistemin altındaki kesme zamanlayıcısıyla aynı sıklıkta güncelleniyor.

Diğer platformlarda, Environment.TickCount64 Windows'ta yeni davranışla tutarlı olan davranışını korur.

Tüm platformlarda, Environment.TickCount uygulamasını korur ve davranışını Environment.TickCount64yansıtır.

Kesinti yaratan değişiklik türü

Bu değişiklik davranışsal bir değişikliktir.

Değişiklik nedeni

Windows, Windows 8 ve Windows Server 2012 ile daha yeni sürümlerde benzer bir davranış değişikliği yaptı; zaman aşımı kabul eden API'ler ( SleepEx ve WaitForMultipleObjectsEx gibi) artık uyanık olunmayan süreyi hesaba katmıyor. Bu durum .NET ile tutarsızlığa neden oldu. Bu tür bekleme API'leri ile Environment.TickCount64birlikte sıklıkla kullanılır ve zamanlayıcıların beklenmedik şekilde tetiklemesi gibi tanılaması zor hataların ortaya çıkmasını sağlar.

Buna ek olarak, kullanılan temel API Olan GetTickCount64 daha az kesindi ve yalnızca sabit bir çözünürlükte güncelleştirildi. İşletim sistemi için temel kesme zamanlayıcısının frekansı değiştiğinde, çözünürlük buna göre ayarlanmadı ve bu durum, daha yüksek öncelikle çalışan uygulamalar için ek çalışmaya yol açabilir. Davranış, macOS ve Linux gibi diğer platformlarda görülen davranışla da tutarsızdı.

Bu değişiklik, temel işletim sistemiyle ve platformlar arasında tutarlılık sağlar. Ayrıca, daha sık güncelleştirmeleri tercih eden uygulamalarda daha yüksek yanıt verme hızına yol açabilir.

Daha yüksek sıklık kesme süreleri kabul edilmediği sürece çoğu kod davranışta herhangi bir değişiklik yaşamamalıdır. Uygulamalar güncelleştirmeleri öncekiyle aynı sıklıkta görmeye devam eder. Ancak güncelleştirme sıklığı uygunsa zaman aşımlarınızın kodunuzun beklentilerini karşılayan doğru bir değere geçtiğinden emin olun veya uygulamanın çok yüksek bir güncelleştirme sıklığını kabul etmediğinden emin olun. (Bu işlem yalnızca bugün P/Invoke API'leri aracılığıyla yapılabilir.)

Bazı kodlar, bir makine uyku durumundan veya düşük güç durumundan uyandırıldıktan hemen sonra zamanlayıcıların artık tetiklenmediğini görebilir. Bu süre uygunsa, bu sürenin her zaman dahil edilebilmesini sağlamak için gibi DateTime.UtcNow API'leri kullanın. Bu tür kodun olası saat ayarlamalarını hesaba eklemesi gerekebilir.

Windows'ta bu değişiklikden etkilenen kod büyük olasılıkla Linux ve macOS gibi diğer platformlarda da aynı senaryodan etkilenmiştir.

Etkilenen API'ler