C# Systray应用程序正在退出

C# Systray应用程序正在退出,c#,windows,icons,system-tray,C#,Windows,Icons,System Tray,我有一个小而简单的C#应用程序,可以更新系统托盘中的图标。我使用它以图形方式显示CPU使用情况。这个应用程序工作得很好。我把窗口隐藏起来,不在任务栏上显示,这样它就不会碍事 我的问题是,它将在一段时间内运行良好。通常几个小时。但它会神秘地退出。没有警告。没有什么。图标刚刚消失,程序不再运行。我已经在不同的条件下在调试器中测试了该程序,所以我认为不是这样。我有什么明显的遗漏吗?如果程序遇到错误并退出,如果窗体被隐藏,我是否应该等待消息?是否有一些“保持活力”的信息或我需要处理的事情 以下是代码的相

我有一个小而简单的C#应用程序,可以更新系统托盘中的图标。我使用它以图形方式显示CPU使用情况。这个应用程序工作得很好。我把窗口隐藏起来,不在任务栏上显示,这样它就不会碍事

我的问题是,它将在一段时间内运行良好。通常几个小时。但它会神秘地退出。没有警告。没有什么。图标刚刚消失,程序不再运行。我已经在不同的条件下在调试器中测试了该程序,所以我认为不是这样。我有什么明显的遗漏吗?如果程序遇到错误并退出,如果窗体被隐藏,我是否应该等待消息?是否有一些“保持活力”的信息或我需要处理的事情

以下是代码的相关部分:

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);
    }
}
任何帮助都将不胜感激

似乎同意Viktor Latypov的评论,你应该这样做:

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

trayIcon.Icon = newIcon;

DestroyIcon(newIcon.Handle);

我建议您添加一个未处理的异常处理程序

可能会引发异常,导致程序退出

然后,引入日志记录来记录异常是什么。我个人更喜欢


我有点惊讶,您可以从非UI线程更新trayIcon,而不会收到跨线程异常。

检查事件查看器系统工具并查找应用程序的错误日志。可能有车祸报告或警告。第二件事-检查任务管理器,看看您的进程是否分配了太多内存。我知道有GC之类的东西,但是Icon.FromHandle()调用看起来很可疑。不讽刺,但你确定它被终止了,而不仅仅是被微软的自动隐藏systray图标功能隐藏了吗?如果你是这个意思的话,系统并没有完全内存不足。它只使用了1GB/8GB。不过,我已经实现了肖恩的建议来解决FromHandle()问题。是的,我确信它已经终止。我先仔细检查了自动隐藏。谢谢。我没有考虑是否使用UI线程,我知道跨线程可能会产生不一致的结果。我将尝试在没有线程的情况下运行它,看看它是否有效。与其在没有线程的情况下运行,不如使用委托更新UI线程。请参阅下面的链接,以了解一种最优秀的扩展方法,该方法使从另一个线程调用UI线程变得轻而易举:谢谢。我也实现了这一点。我将尝试运行它一段时间,看看它是否解决了问题。