2012-06-27 1 views
0

У меня есть небольшое, простое приложение C#, которое обновляет значок в системном трее. Я использую его для графического отображения использования ЦП. Приложение отлично работает. Я держу Window скрытым и не показываю его на панели задач, чтобы он не мешал.Приложение Systray Выход

Моя проблема в том, что она будет работать отлично на некоторое время. Часто несколько часов. Но тогда он загадочно уйдет. Нет предупреждений. Ничего. Значок только что исчез, и программа больше не работает. Я тестировал программу в отладчике в разных условиях, поэтому я не думаю, что это так. Есть ли что-то очевидное, что мне не хватает? Если программа встречает ошибку и завершает работу, я должен ожидать сообщения, если форма скрыта? Есть ли какое-нибудь сообщение «keep-alive» или что-то, что мне нужно обработать?

Вот соответствующий раздел кода:

public Form1() 
{ 
    InitializeComponent(); 

    trayIcon = new NotifyIcon(); 
    trayIcon.Text = "CPU Utilization"; 
    trayIcon.Icon = new Icon(SystemIcons.Application, 40, 40); 

    trayIcon.Visible = true; 

    update = new Thread(new ThreadStart(UpdateCPU)); 
    update.Start(); 
} 

protected override void OnLoad(EventArgs e) 
{ 
    Visible = false; 
    ShowInTaskbar = false; 

    base.OnLoad(e); 
} 

private void UpdateCPU() 
{ 
    Bitmap bm = new Bitmap(32, 32); 
    Graphics g = Graphics.FromImage(bm); 

    while (true) 
    { 
     g.FillRectangle(new SolidBrush(c3), 17, 17, 15, 15); 
     trayIcon.Icon = System.Drawing.Icon.FromHandle(bm.GetHicon()); 

     Thread.Sleep(1000); 
    } 
} 

Любая помощь будет принята с благодарностью!

+2

Проверьте системный инструмент просмотра событий и найдите журнал ошибок для своего приложения. Возможно, есть отчет о сбоях или предупреждение. Во-вторых, проверьте диспетчер задач и посмотрите, выделяет ли ваш процессор слишком много памяти. Я понимаю, что есть GC и прочее, но вызов Icon.FromHandle() выглядит подозрительным. –

+1

Не быть саркастичным, но вы уверены, что оно завершено, а не просто скрыто функциональностью значков системы sysray от Microsoft. – adelphus

+0

Система не была полностью не в памяти, если это то, что вы имели в виду. Он использовал только 1 ГБ/8 ГБ. Однако я применил предложение Шона исправить проблему FromHandle(). – user1376232

ответ

1

Я хотел бы предложить вам добавить необработанное исключение Обработчик

Global Exception Handling for winforms control

Исключение составляет вероятно, будет выброшен, что приведет к выходу вашей программы.

Затем введите регистрацию, чтобы зарегистрировать, что такое Исключение. Лично я предпочитаю NLog.

Я немного удивлен тем, что вы можете обновить trayIcon из потока, отличного от UI, без получения исключения с перекрестными потоками.

+0

Спасибо. Я не думал о том, следует ли использовать поток пользовательского интерфейса, и я знаю, что кросс-threading может дать непоследовательные результаты. Я попробую запустить его без потоков и посмотреть, работает ли это. – user1376232

+0

Вместо того, чтобы работать без потоков, просто используйте делегат для обновления потока пользовательского интерфейса. См. Следующую ссылку для самого превосходного метода расширения, который вызывает вызов в потоке пользовательского интерфейса из другого потока реального веяния: http://stackoverflow.com/a/3588137/141172 –

0

documentation, похоже, согласен с комментариями Виктора Латыпова, вы должны делать что-то вроде этого:

Icon newIcon = Icon.FromHandle(bm.GetHicon()); 

trayIcon.Icon = newIcon; 

DestroyIcon(newIcon.Handle); 
+0

Спасибо. Я тоже это реализовал. Я попробую запустить его некоторое время и посмотреть, исправляет ли он проблему. – user1376232