读书人

C#获得系统内存及开机时间的有关问题

发布时间: 2012-02-29 16:44:11 作者: rapoo

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 属性可获取此计算机上的当前本地日期和时间。



[解决办法]
我觉得Environment.TickCount这个东西是有问题的,呵呵
他最多只能表示50天不到
如果你开机大于50天了..........

http://blog.csdn.net/afxid/archive/2006/06/09/784526.aspx
看看这个可以么?

另外一个比较BT的做法是,弄个服务,开机就把时间写进注册表~~~~

读书人网 >C#

热点推荐