1

我继承了一个现有的 .NET 应用程序 (C#),它由一个 Windows 服务和一个控制 GUI 组成。GUI 应用程序、服务和设置项目嵌入在 vs2010 解决方案中。GUI 是一个由静态主类启动的 Windows 窗体,因为它在最小化时必须驻留在托盘中。GUI 有一个计时器,它定期检查服务是否处于活动状态,并相应地启用/禁用弹出菜单“启动服务”和“停止服务”条目。问题是,当我尝试卸载时,该服务在 GUI 之前被删除,并且 GUI 中的 timer_Tick 抛出异常,因为它没有找到该服务。这是主类用来启动应用程序的代码:

static class Program
{
    /// <summary>
    /// Punto di ingresso principale dell'applicazione.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new frmMain());
    }
}

计时器执行的代码(我添加了 try/catch 块来捕获异常):

private void tmrCheckService_Tick(object sender, EventArgs e)
    {
        try
        {
            ServiceController service = new ServiceController("MyService");
            if (service.Status == ServiceControllerStatus.Running)
            {
                startToolStripMenuItem.Enabled = false;
            }
            else
            {
                startToolStripMenuItem.Enabled = true;
            }

            service = null;
        }
        catch (InvalidOperationException oEx)
        {
            //tmrCheckService.Stop();
            //this.Close();
        }
    }

如果我取消注释 catch 块中的代码,应用程序将退出并且卸载成功。我不确定这是管理错误的最佳方法。我更喜欢管理卸载过程,在删除服务之前停止和删除 GUI,但我找不到这样做的方法。我认为一个可能的解决方案是覆盖服务安装程序的 on beforeuninstall 方法,找到附加到我的 GUI 应用程序的进程并以编程方式将其终止。如果这个解决方案更好,我怎么能实现它?谢谢你。

4

1 回答 1

0

我认为,如果您已卸载该服务,则可能会出现异常..您需要处理的异常。你唯一的选择是从服务到用户界面的某种形式的卸载通知,但这似乎过于复杂。只需处理任何异常并整理任何资源

于 2012-05-22T10:43:57.773 回答