C#获得系统内存及开机时间的问题
网上找的获得内存的代码:
--------------------------
private static string GetPhisicalMemory()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher(); //用于查询一些如系统信息的管理对象
searcher.Query = new SelectQuery( "Win32_PhysicalMemory ", " ", new string[] { "Capacity " });//设置查询条件
ManagementObjectCollection collection = searcher.Get(); //获取内存容量
ManagementObjectCollection.ManagementObjectEnumerator em = collection.GetEnumerator();
int capacity = 0;
while (em.MoveNext())
{
ManagementBaseObject baseObj = em.Current;
if (baseObj.Properties[ "Capacity "].Value != null)
{
try
{
capacity += int.Parse(baseObj.Properties[ "Capacity "].Value.ToString());
}
catch
{
return " ";
}
}
}
return (capacity/1024/1024).ToString();
}
--------------------------
获得系统启动时间:
--------------------------
TimeSpan m_WorkTimeTemp = new TimeSpan(Convert.ToInt64(Environment.TickCount) * 10000);
string m_WorkTime = m_WorkTimeTemp.Days + "天 " + m_WorkTimeTemp.Hours + "小时 " + m_WorkTimeTemp.Minutes + "分钟 " + m_WorkTimeTemp.Seconds + "秒 ";
--------------------------
问题:
--------------------------
我在我的机器上(vista iis7)上面显示的为:
# 内存:1024 MB
# 开机时间:0天20小时34分钟55秒
正常
但是在服务器上(win2003 iis6,内存2G)显示为:
# 内存:-2048 MB
# 开机时间:-6天-9小时-32分钟-25秒
内存显示为负数,开机时间为43天多,错误如上。。
请问这是为啥?
------解决方案--------------------关于开机时间
看MSDN
// Sample for the Environment.TickCount property.
// TickCount cycles between Int32.MinValue, which is a negative
// number, and Int32.MaxValue once every 49.8 days. This sample
// removes the sign bit to yield a nonnegative number that cycles
// between zero and Int32.MaxValue once every 24.9 days.
using System;
class Sample
{
public static void Main()
{
int result = Environment.TickCount & Int32.MaxValue;
Console.WriteLine( "TickCount: {0} ", result);
}
}
/*
This example produces the following results:
TickCount: 101931139
*/
你开机时间是不是太长了~~~
------解决方案--------------------int 类型的范围最大是 2G-1, 2G 内存已经超过范围,所以显示为-2048一点不奇怪
------解决方案--------------------那些抢分的都归隐了~~~~
呵呵
计算这些东西最好不要使用int
------解决方案--------------------这是微软的帮助:TickCount最高只能获取到 49.8 天
备注
该属性的值从系统计时器派生,并以 32 位有符号整数的形式存储。因此,如果系统连续运行,TickCount 将在约 24.9 天内从零递增至 Int32.MaxValue,然后跳至 Int32.MinValue(这是一个负数),再在接下来的 24.9 天内递增至零。
TickCount 属性的分辨率不能小于 500 毫秒。
TickCount 不同于 Ticks 属性,后者是自 1/1/0001 中午 12:00 以后经过的 100 毫微秒间隔数。
使用 DateTime.Now 属性可获取此计算机上的当前本地日期和时间。