SLa*_*aks 54
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*tin 39
我有点迟了,但另一个简单的方法是使用GetTickCount64函数,该函数从Windows Vista开始可用,并且不会像GetTickCount那样溢出:
public static TimeSpan GetUpTime()
{
return TimeSpan.FromMilliseconds(GetTickCount64());
}
[DllImport("kernel32")]
extern static UInt64 GetTickCount64();
Run Code Online (Sandbox Code Playgroud)
adr*_*nks 26
System.Environment.TickCount获取自系统重新启动以来的毫秒数.
请注意,它是一个Int32,并将在24.9天后溢出并将变为负数.请参阅MDSN文档上的备注.
Qua*_*tic 19
58 days 17 hours根据任务管理器,我的机器有正常运行时间.我经历过并尝试了每个答案,快速的一点点关闭(约1-3分钟,但超过58天的正常运行时间):
ManagementObject LastBootUpTime
最后两个,使用PerformanceCounter或使用ManagementObject,始终与Windows任务管理器在同一秒内(只需要接受我的话,或者使用下面的代码自己尝试).根据结果,我将使用该PerformanceCounter方法,因为它比58 days 17 hours任务管理器快得多,但仍然完全准确.
请注意,我确实在打印时间之前减去了每个方法的当前经过时间,但是整个过程运行时间不到2秒,因此无法通过不正确地计算执行时间来解释时移.这是我使用的代码:
Stopwatch.GetTimeStamp(): 58days 17hours 11minutes 25seconds
~Time to calculate (ms): 6.8413
DllImport GetTickCount64(): 58days 17hours 13minutes 34seconds
~Time to calculate (ms): 0.2192
PerformanceCounter(System, System Up Time): 58days 17hours 14minutes 02seconds
~Time to calculate (ms): 1233.2854
ManagementObject LastBootUpTime: 58days 17hours 14minutes 02seconds
~Time to calculate (ms): 30.0283
Run Code Online (Sandbox Code Playgroud)
Ste*_*nds 13
如果您使用更高版本的 .NET(Core 3.0/.NET 5.0 或更高版本),则该类Environment现在具有TickCount64 属性。
这不会受到属性的环绕问题的影响TickCount,您也不必求助于 P/Invoke 来获取值。
long tickCountMs = Environment.TickCount64;
var uptime = TimeSpan.FromMilliseconds(tickCountMs);
Run Code Online (Sandbox Code Playgroud)
Rbj*_*bjz 11
精确和大于System.Environment.TickCount,不涉及OS可怕的性能计数器,WMI或本机调用:
var ticks = Stopwatch.GetTimestamp();
var uptime = ((double)ticks) / Stopwatch.Frequency;
var uptimeSpan = TimeSpan.FromSeconds(uptime);
Run Code Online (Sandbox Code Playgroud)
小智 7
最简单和正确的方法是
public static TimeSpan GetUptime()
{
ManagementObject mo = new ManagementObject(@"\\.\root\cimv2:Win32_OperatingSystem=@");
DateTime lastBootUp = ManagementDateTimeConverter.ToDateTime(mo["LastBootUpTime"].ToString());
return DateTime.Now.ToUniversalTime() - lastBootUp.ToUniversalTime();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36459 次 |
| 最近记录: |