Pour obtenir le temps de fonctionnement du système, utilisez le code suivant:
TimeSpan uptime;
using (var uptimeCounter = new PerformanceCounter("System", "System Up Time")) {
uptimeCounter.NextValue();
uptime = TimeSpan.FromSeconds(uptimeCounter.NextValue());
}
EDIT: Notez que ce ne peut pas être utilisé par du code partiellement approuvé.
Vous pouvez utiliser TimeSpan.FromMilliseconds(Environment.TickCount)
, mais il va envelopper après deux semaines. J'ai écrit une page d'état du serveur dans ASP.Net qui montre le temps de disponibilité du serveur et plus encore.
Voici la page entière:
<%@ Page Title="Server Stats" Language="C#" MasterPageFile="~/Admin.Master" AutoEventWireup="true"
CodeFile="Stats.aspx.cs" Inherits="Stats" %>
<%@ Import Namespace="System.Diagnostics" %>
<%@ Import Namespace="Microsoft.VisualBasic.Devices" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
<style type="text/css">
body {
background-color: #9DC0E4;
}
table.Details {
width: 550px;
margin-left: -275px;
left: 50%;
position: absolute;
}
table.Details tbody.Group {
border-bottom: solid black 2px;
margin-bottom: 15px;
}
table.Details th.Group {
font-size: x-large;
border-bottom: dashed 1px navy;
}
table.Details th.Name {
text-align: left;
}
table.Details td.Value {
text-align: right;
}
</style>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<%
var computer = new ComputerInfo();
using (var iis = Process.GetCurrentProcess())
using (var cpu = new PerformanceCounter("Processor", "% Processor Time", "_Total"))
using (var uptime = new PerformanceCounter("System", "System Up Time")) {
cpu.NextValue();
uptime.NextValue();
%>
<table class="Details">
<tbody class="Group">
<tr>
<th class="Group" colspan="2">Environment</th>
</tr>
<tr>
<th class="Name">Local server time</th>
<td class="Value">
<%= DateTime.Now.ToString("F")%></td>
</tr>
<tr>
<th class="Name">OS</th>
<td class="Value">
<%= computer.OSFullName%><br />
<%= Environment.OSVersion.ToString()%></td>
</tr>
<tr>
<th class="Name">Machine name</th>
<td class="Value">
<%= Environment.MachineName%></td>
</tr>
<tr>
<th class="Name">User name</th>
<td class="Value">
<%= Environment.UserName%></td>
</tr>
<tr>
<th class="Name">Windows domain</th>
<td class="Value">
<%= Environment.UserDomainName%></td>
</tr>
</tbody>
<tbody class="Group">
<tr>
<th class="Group" colspan="2">IIS</th>
</tr>
<tr>
<th class="Name">IIS Uptime</th>
<td class="Value">
<%= (DateTime.Now- iis.StartTime).ToApproximateString()%></td>
</tr>
<tr>
<th class="Name">Priority</th>
<td class="Value">
<%= iis.PriorityClass%></td>
</tr>
<tr>
<th class="Name">Physical Memory Used</th>
<td class="Value">
<%= ToSizeString(iis.WorkingSet64)%></td>
</tr>
<tr>
<th class="Name">Virtual Memory Used</th>
<td class="Value">
<%= ToSizeString(iis.VirtualMemorySize64)%></td>
</tr>
</tbody>
<tbody class="Group">
<tr>
<th class="Group" colspan="2">Hardware</th>
</tr>
<tr>
<th class="Name">Processors</th>
<td class="Value">
<%= Environment.ProcessorCount.ToString()%></td>
</tr>
<tr>
<th class="Name">Physical memory</th>
<td class="Value">
<%= ToSizeString(computer.TotalPhysicalMemory)%></td>
</tr>
<tr>
<th class="Name">Virtual memory</th>
<td class="Value">
<%= ToSizeString(computer.TotalVirtualMemory)%></td>
</tr>
</tbody>
<tbody class="Group">
<tr>
<th class="Group" colspan="2">Performance</th>
</tr>
<tr>
<th class="Name">Uptime</th>
<td class="Value">
<%= TimeSpan.FromSeconds(uptime.NextValue()).ToApproximateString()%>
</td>
</tr>
<tr>
<th class="Name">CPU Usage</th>
<td class="Value">
<%= (cpu.NextValue()/100).ToString("p")%>
</td>
</tr>
<tr>
<th class="Name">Physical memory free</th>
<td class="Value">
<%= ToSizeString(computer.AvailablePhysicalMemory)%></td>
</tr>
<tr>
<th class="Name">Virtual memory free</th>
<td class="Value">
<%= ToSizeString(computer.AvailableVirtualMemory)%></td>
</tr>
</tbody>
</table>
<%} %>
</asp:Content>
ToSizeString
est défini dans le fichier .cs
:
protected static string ToSizeString(double bytes) {
var culture = CultureInfo.CurrentUICulture;
const string format = "#,0.0";
if (bytes < 1024)
return bytes.ToString("#,0", culture);
bytes /= 1024;
if (bytes < 1024)
return bytes.ToString(format, culture) + " KB";
bytes /= 1024;
if (bytes < 1024)
return bytes.ToString(format, culture) + " MB";
bytes /= 1024;
if (bytes < 1024)
return bytes.ToString(format, culture) + " GB";
bytes /= 1024;
return bytes.ToString(format, culture) + " TB";
}
ToApproximateString
est une méthode d'extension définie ailleurs:
public static string ToApproximateString(this TimeSpan time) {
if (time.TotalDays > 14)
return ((int)(time.TotalDays/7)).ToString("#,0.0") + " weeks";
if (14 - time.TotalDays < .75)
return "two weeks";
if (time.TotalDays > 1)
return time.TotalDays.ToString("#,0.0") + " days";
else if (time.TotalHours > 1)
return time.TotalHours.ToString("#,0.0") + " hours";
else if (time.TotalMinutes > 1)
return time.TotalMinutes.ToString("#,0.0") + " minutes";
else
return time.TotalSeconds.ToString("#,0.0") + " seconds";
}
De quelle confiance doit-il bénéficier? Belle solution en passant. +1 –
Il fonctionne bien sur mon hôte (LFC). – SLaks
'PerformanceCounter' ne peut pas être utilisé par du code partiellement approuvé. – SLaks