Hello my friends!
Today I want to talk about some problems encountered using the property Environment.TickCount, available since the version 1.1 of .NET Framework.
In a nutshell, this property tells you how many milliseconds elapsed since system boot.
Why did I have to use it?
During the development of TDP Robot, that I remind you can download here, I developed the event “TDP Robot service start event”, which at first used the property Environment.TickCount to find out if a TDP Robot service start was due to a system reboot or a simple service start.
So, having used it, I can answer the original question and say with certainty that Environment.TickCount is not reliable…
You can find the reason in Microsoft documentation at this address, which states the following:
Because the value of the TickCount property value is a 32-bit signed integer, if the system runs continuously, TickCount will increment from zero to Int32.MaxValue for approximately 24.9 days, then jump to Int32.MinValue, which is a negative number, then increment back to zero during the next 24.9 days. You can work around this issue by calling the Windows GetTickCount function, which resets to zero after approximately 49.7 days, or by calling the GetTickCount64 function.
What stated above is clearly a problem if you need to know exactly the system uptime!
To workaround this problem you could use the Windows API call GetTickCount64() which you can declare in you C# code as follow:
[DllImport("kernel32")] extern static ulong GetTickCount64();
The function above return a 64 bit unsigned long. This means that you don’t have to worry about negative numbers or counter reset after 49.7 days.
But there is another problem: from the tests done on my PC (a Dell Inspiron laptop with Windows 10) I found that the counter obtained, both with Environment.GetTickCount and with the GetTickCount64 API, is never reset if you shutdown the system. It is only reset if you make a system reboot!
This is true also using other methods to get the system uptime, like using WMI calls (you can find some examples searching on the Internet).
Unfortunately, I do not have a solution to the problem yet, but I will not fail to post it as soon as I have one!
PS: in .NET 5 you can use the property Environment.TickCount64, so at least you can avoid a direct call to Windows API 🙂