【问题标题】:Systray Application Exiting系统托盘应用程序退出
【发布时间】:2012-06-27 21:26:00
【问题描述】:

我有一个小而简单的 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);
    }
}

任何帮助将不胜感激!

【问题讨论】:

  • 检查事件查看器系统工具并查找您的应用程序的错误日志。也许有崩溃报告或警告。第二件事 - 检查任务管理器,看看您的进程是否分配了太多内存。我知道有 GC 和其他东西,但 Icon.FromHandle() 调用看起来很可疑。
  • 不要讽刺,但您确定它已被终止,而不仅仅是被微软的自动隐藏系统托盘图标功能隐藏?
  • 系统并非完全内存不足,如果这就是您的意思。它仅使用 1 GB / 8 GB。不过,我已经实施了 Sean 的建议来解决 FromHandle() 问题。
  • 是的,我确定它已被终止。我首先仔细检查了自动隐藏。

标签: c# windows icons system-tray


【解决方案1】:

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

Global Exception Handling for winforms control

一个异常可能被抛出,导致你的程序退出。

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

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

【讨论】:

  • 谢谢。我没有考虑要不要使用UI线程,我知道跨线程会给出不一致的结果。我会尝试在没有线程的情况下运行它,看看是否可行。
  • 与其在没有线程的情况下运行,只需使用委托来更新您的 UI 线程。请参阅以下链接,了解最出色的扩展方法,该方法使从另一个线程调用 UI 线程变得轻而易举:stackoverflow.com/a/3588137/141172
【解决方案2】:

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

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

trayIcon.Icon = newIcon;

DestroyIcon(newIcon.Handle);

【讨论】:

  • 谢谢。我也实现了这一点。我会尝试运行它一段时间,看看它是否能解决问题。
猜你喜欢
  • 1970-01-01
  • 2010-10-06
  • 2012-09-16
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 2016-09-03
相关资源
最近更新 更多