Delen via


Environment.TickCount is afgestemd op het gedrag van time-outs in Windows.

In Windows Environment.TickCount en Environment.TickCount64 zijn bijgewerkt om consistent te zijn met het gedrag dat wordt gezien in de onderliggende wacht-API's voor het besturingssysteem. Ze omvatten geen slaap- of sluimertijd meer als onderdeel van de verstreken tijd. Deze wijziging zorgt er ook voor dat Windows-gedrag consistent is met het gedrag dat op andere platforms wordt gezien en zorgt ervoor dat het wordt bijgewerkt met dezelfde frequentie als de onderliggende interrupttimer voor het systeem. Deze wijziging zorgt voor een hogere reactiesnelheid in apps die zich hebben aangemeld voor updates met een hogere frequentie.

Geïntroduceerde versie

.NET 11 Preview 1

Vorig gedrag

Eerder retourneerde Windows Environment.TickCount64 het resultaat van de Win32 GetTickCount64-API , die werd bijgewerkt met een vaste frequentie van 10-16 ms (meestal 15,5 ms) en de tijd die het systeem in slaapstand, sluimerstand of andere statussen met weinig vermogen had opgenomen.

Op andere platforms (zoals Linux en macOS) wordt Environment.TickCount64 bijgewerkt met dezelfde frequentie als de onderliggende interrupttimer voor het systeem en omvat het alleen de tijd waarin het systeem als 'wakker' werd beschouwd.

Op alle platforms keerde Environment.TickCount het afgekapt resultaat van Environment.TickCount64 terug en vertoonde hetzelfde gedrag, maar liep ongeveer elke 49 dagen over.

Nieuw gedrag

In Windows Environment.TickCount64 wordt nu het resultaat van de Win32 QueryUnbiasedInterruptTime-API geretourneerd. Deze wijziging brengt de .NET API inline met het gedrag dat wordt gebruikt in de onderliggende wacht-API's voor het besturingssysteem. Het omvat niet langer niet-wakkere tijden en wordt nu bijgewerkt met dezelfde frequentie als de onderliggende interrupttimer van het systeem.

Op andere platforms Environment.TickCount64 blijft het gedrag behouden, wat consistent is met het nieuwe gedrag in Windows.

Op alle platformen behoudt Environment.TickCount zijn implementatie en weerspiegelt het gedrag van Environment.TickCount64.

Type van brekende verandering

Deze wijziging is een gedragswijziging.

Reden voor wijziging

Windows heeft een vergelijkbare wijziging ondergaan in Windows 8 en Windows Server 2012 en nieuwere versies, waardoor API's die een time-out accepteren (zoals SleepEx en WaitForMultipleObjectsEx) niet langer rekening houden met niet-actieve tijd. Dit heeft een inconsistentie met .NET veroorzaakt, omdat wacht-API's vaak worden gebruikt in combinatie met Environment.TickCount64, wat leidt tot moeilijk te diagnosticeren fouten zoals timers die onverwacht worden geactiveerd.

Bovendien was de onderliggende API die werd gebruikt, GetTickCount64, minder nauwkeurig en alleen bijgewerkt met een vaste resolutie. Deze resolutie werd niet aangepast wanneer de onderliggende interrupt-timer voor het besturingssysteem zijn frequentie had veranderd, wat ertoe zou kunnen leiden dat extra werk wordt verricht voor apps die hadden gekozen om met een hogere prioriteit te draaien. Het gedrag was ook inconsistent met het gedrag dat wordt gezien op andere platforms, zoals macOS en Linux.

De wijziging zorgt voor consistentie met het onderliggende besturingssysteem en op verschillende platforms. Het kan ook leiden tot een hogere reactiesnelheid in apps die zich hebben aangemeld voor frequentere updates.

Tenzij er is gekozen voor hogere frequentie-onderbrekingen, zal de meeste code geen verandering in gedrag ervaren. Apps blijven updates zien met dezelfde frequentie als voorheen. Als de updatefrequentie echter relevant is, moet u ervoor zorgen dat uw time-outs een juiste waarde doorgeven die voldoet aan de verwachtingen van uw code of ervoor zorgen dat de toepassing niet te hoge updatefrequentie gebruikt. (Dit kan alleen worden gedaan via P/Invoke-API's vandaag.)

Sommige code kan zien dat timers niet meer onmiddellijk worden geactiveerd nadat een machine uit een slaap- of laagvermogensstatus wordt gehaald. Als deze tijd relevant is, gebruikt u API's, zoals DateTime.UtcNow om ervoor te zorgen dat deze tijd altijd kan worden opgenomen. Deze code moet mogelijk rekening houden met mogelijke klokaanpassingen.

Code die wordt beïnvloed door deze wijziging in Windows, wordt waarschijnlijk al beïnvloed door hetzelfde scenario op andere platforms, zoals Linux en macOS.

Betreffende API's