Retrieve System Uptime Using C#

Retrieve system uptime using C#

public TimeSpan UpTime {
get {
using (var uptime = new PerformanceCounter("System", "System Up Time")) {
uptime.NextValue(); //Call this an extra time before reading its value
return TimeSpan.FromSeconds(uptime.NextValue());
}
}
}

Finding uptime of a program but showing it in MINUTES

From the MSDN documentation, we can see that Environment.TickCount

Gets the number of milliseconds elapsed since the system started.

You can then convert it to minutes like so:

var minutes = (Environment.TickCount - serverStartTickCount) / 60000; // 1000 ms/s * 60 s/m

Alternatively, you might want to consider storing DateTime.Now when the server starts. Say your class is called Program, you can add this to it:

public static readonly DateTime ServerStartTime = DateTime.Now;

and then do this when the command is run:

var uptime = DateTime.Now - Program.ServerStartTime;
var minutes = uptime.TotalMinutes;

This would allow you to get an accurate uptime when the Environment.TickCount roll over every few weeks, as @Carlos pointed out.

How to get the up time of the machine?

I suggest you to use the command line : net statistics workstation and parse the output. The time that machine is running is after "Statistics since ".

System Up Time using C# is not correct

DateTime.MinValue value is 01/01/0001 00:00:00. So adding this value 4 days 3 hours 22mins, result will be 05/01/0001 03:22:00.

And since you formatting that value, it is too normal to get 05 as a day part.

Instead of that, you can directly format your UpTime property as a TimeSpan.

var f = new Form1();
textBox1.Text = f.UpTime.ToString(@"dd\.hh\:mm\:ss", CultureInfo.InvariantCulture);

View Windows UpTime dynamically in WPF

Your code looks good. The only thing missing is that you should call it periodically to update the UI.

Take a look at the example: https://learn.microsoft.com/en-us/dotnet/api/system.windows.threading.dispatchertimer?view=windowsdesktop-6.0

Important to note, since you want to update UI:

In order to access objects on the user interface (UI) thread, it is necessary to post the operation onto the Dispatcher of the user interface (UI) thread using Invoke or BeginInvoke. Reasons for using a DispatcherTimer as opposed to a System.Timers.Timer are that the DispatcherTimer runs on the same thread as the Dispatcher

Your only slightly modified code might then look something like this:

DispatcherTimer dispatcherTimer;

public MainWindow()
{
InitializeComponent();
DispatcherTimer_Tick(null, EventArgs.Empty);
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Interval = TimeSpan.FromSeconds(1);
dispatcherTimer.Tick += DispatcherTimer_Tick;
dispatcherTimer.Start();
}

private void DispatcherTimer_Tick(object? sender, EventArgs e)
{
PerformanceCounter upTime = new PerformanceCounter("System", "System Up Time");
upTime.NextValue();
TimeSpan ts = TimeSpan.FromSeconds(upTime.NextValue());
UpTime.Text = "UpTime: " + ts.Days + ":" + ts.Hours + ":" + ts.Minutes + ":" + ts.Seconds;
}

Read windows start time for Win7 and Win10 via Visual Studio

Well, since System.Environment.TickCount is of type int it has maximum value

 int.MaxValue = 2147483647 // milliseconds

which is

 2147483647 ms = 
2147483.647 seconds ~
24.85 days

so if you switched on your workstation about a month ago or earlier you'll get wrong time because of integer overflow (not Windows version)

How to get system uptime in the last 24 hours

Use the Event Logs. In the System logs, you should see event #6006 (source: EventLog) when the system goes down, and event #6009 (same source) when it comes back up. See KB article 196452 for more info (note that unexpected shutdowns--that is, crashes--will give event #6008 instead of #6006).

So if you run through all the events of the last 24 hours, your uptime is 24 hours minus all the time between the 6006 and the 6009 events.



Related Topics



Leave a reply



Submit