次の方法で共有


Environment.TickCount が Windows のタイムアウト動作と一貫性を持つ

Windows では、os の基になる待機 API で見られる動作と一致するように、 Environment.TickCountEnvironment.TickCount64 が更新されました。 測定された経過時間の一部として、スリープ時間や休止時間は含まれていません。 この変更により、Windows の動作は他のプラットフォームで見られる動作と一致し、システムの基になる割り込みタイマーと同じ頻度で更新されます。 この変更により、頻度の高い更新プログラムにオプトインしたアプリの応答性が向上します。

導入されたバージョン

.NET 11 Preview 1

以前の動作

以前は、Windows では、 Environment.TickCount64 Win32 GetTickCount64 API の結果が返されました。この API は、10 から 16 ミリ秒 (通常は 15.5 ミリ秒) の固定周期で更新され、システムがスリープ状態、休止状態、またはその他の低電力状態で費やした時間を含めていました。

他のプラットフォーム (Linux や macOS など) では、 Environment.TickCount64 システムの基になる割り込みタイマーと同じ頻度で更新され、システムが "起動中" と見なされた時間のみが含まれます。

すべてのプラットフォームで、 Environment.TickCountEnvironment.TickCount64 の切り捨てられた結果を返し、同じ動作を示しましたが、約 49 日ごとにオーバーフローする可能性がありました。

新しい動作

Windows では、 Environment.TickCount64 は Win32 QueryUnbiasedInterruptTime API の結果を返すようになりました。 この変更により、.NET API は、OS の基になる待機 API で使用される動作と共にインラインになります。 システムの基になる割り込みタイマーと同じ頻度で更新され、非アクティブ時間は含まれなくなりました。

他のプラットフォームでは、 Environment.TickCount64 はその動作を保持します。これは Windows の新しい動作と一致します。

すべてのプラットフォームで、 Environment.TickCount は実装を維持し、 Environment.TickCount64の動作を反映します。

破壊的変更の種類

この変更は 動作の変更です。

変更の理由

Windows では、タイムアウトを受け入れる API ( SleepExWaitForMultipleObjectsEx など) が起動しない時間を考慮しなくなったように、Windows 8 および Windows Server 2012 以降のバージョンでも同様の動作の破壊的変更が行われました。 そのため、待機 API が Environment.TickCount64と組み合わせて頻繁に使用されるため、.NET に不整合が発生し、タイマーが予期せず発生するなどのバグを診断しにくくなりました。

さらに、使用された基になる API である GetTickCount64 は、精度が低く、固定解像度でのみ更新されました。 OS の基になる割り込みタイマーの頻度が変更された場合、この解決策は調整されませんでした。これにより、より高い優先度で実行することを選択したアプリに対して追加の作業が行われる可能性があります。 この動作は、macOS や Linux などの他のプラットフォームで見られる動作とも矛盾していました。

この変更により、基になる OS とプラットフォーム間の一貫性が確保されます。 また、より頻繁な更新を選択したアプリの応答性が高くなる可能性もあります。

より高い頻度の割り込み時間にオプトインしない限り、ほとんどのコードでは動作の変更は発生しません。 アプリには、以前と同じ頻度で更新プログラムが表示され続けます。 ただし、更新頻度が関連する場合は、タイムアウトがコードの期待を満たす正しい値で渡されるようにするか、アプリケーションが更新頻度が高すぎないようにしてください。 (これは現在、P/Invoke API を介してのみ実行できます)。

一部のコードでは、マシンがスリープ状態または低電力状態から復帰した直後にタイマーが起動しなくなることがあります。 このような時間が関連する場合は、 DateTime.UtcNow などの API を使用して、そのような時間を常に含めることができます。 このようなコードでは、クロック調整の可能性を考慮する必要があります。

Windows でのこの変更の影響を受けたコードは、Linux や macOS などの他のプラットフォーム上の同じシナリオによって既に影響を受けます。

影響を受ける API