Я пытаюсь показать загрузку процессора и памяти в строке состояния формы MDI. Состояние CPU и памяти работают правильно, если я просто вызываю их методом. Но сейчас я хочу сделать таймер, который продолжает обновлять две метки до тех пор, как приложение работает:Таймер заставляет форму выйти сразу после запуска
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, будет ли он зависеть или заикаться?
UPDATE
Когда я поставил точку останова на этой линии:
_labelCpuStatus.Text = string.Format("CPU LOAD: ") + string.Format("{0:0.##}%", SystemDiagnostic[0]).PadRight(8);
Я заметил, что он работает как 2 или 3 раза, и он обновляет метку, но она завершает работу без предупреждения или исключение!
Как вы используете форму? то есть 'Program.cs' и' Main (...) '? –
Как обычная winform ... да, она проходит через Program.cs –