【发布时间】:2011-12-22 13:27:03
【问题描述】:
我试图在 MDI 表单的状态栏中显示 CPU 和内存负载。如果我只是用一种方法调用它们,cpu 和内存状态就可以正常工作。但是现在我想制作一个 Timer,只要应用程序正在运行,它就会继续更新两个标签:
public System.Threading.Timer MainTimer;
public System.Threading.TimerCallback MainTimerCallback;
private void InitializeTimer()
{
MainTimerCallback = new System.Threading.TimerCallback(MainTimer_Tick);
MainTimer = new System.Threading.Timer(MainTimerCallback,this,0,100);
}
private void MainTimer_Tick(object obj)
{
UpdateSystemDiagnostics();
}
然后我在我的 MDI 表单构造函数中编写代码:
public MainForm()
{
InitializeComponent();
InitializeSystemDiagnostics();
InitializeTimer();
}
这是我的诊断代码:
private PerformanceCounter _cpuLoad;
private PerformanceCounter _ramFree;
public float[] SystemDiagnostic = new float[2] { 0, 0 };
private void InitializeSystemDiagnostics()
{
//Diagnostics
_cpuLoad = new PerformanceCounter { CategoryName = "Processor", CounterName = "% Processor Time", InstanceName = "_Total" };
_ramFree = new PerformanceCounter("Memory", "Available MBytes");
}
private void UpdateSystemDiagnostics()
{
SystemDiagnostic[0] = _cpuLoad.NextValue();
SystemDiagnostic[1] = _ramFree.NextValue();
_labelCpuStatus.Text = string.Format("CPU LOAD: ") + string.Format("{0:0.##}%", SystemDiagnostic[0]).PadRight(8);
_labelMemoryStatus.Text = string.Format("FREE MEMORY: {0}MB", SystemDiagnostic[1]);
}
为什么这会导致表单一打开就关闭?即使我点击调试,它也会立即打开和关闭!
另外我的另一个问题是:这个计时器是否在另一个线程上运行?如果我将一个耗时的操作传递给它的 Tick 事件,它会导致 UI 冻结或卡顿吗?
更新
当我在这一行设置断点时:
_labelCpuStatus.Text = string.Format("CPU LOAD: ") + string.Format("{0:0.##}%", SystemDiagnostic[0]).PadRight(8);
我注意到它可以工作 2 或 3 次,它会更新标签,但它会退出,没有任何警告或异常!
【问题讨论】:
-
您是如何运行该表单的?即
Program.cs和Main(...)? -
就像一个普通的winform...是的,它通过Program.cs运行
标签: c# winforms multithreading timer