2012-05-22 86 views
1

我已經繼承了由Windows服務和控制GUI組成的現有.NET應用程序(C#)。 GUI應用程序,服務和安裝項目都嵌入在vs2010解決方案中。 GUI是一個由靜態主類啓動的窗體,因爲它必須在最小化時駐留在托盤中。 GUI有一個定時器,定期檢查服務是否處於活動狀態,並相應地啓用/禁用彈出式菜單「啓動服務」和「停止服務」條目。 問題是,當我嘗試卸載時,服務在GUI和GUI中的timer_Tick之前被刪除,因爲它找不到該服務。 這裏是使用主類來啓動應用程序的代碼:在卸載之前關閉.NET應用程序

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,但我找不到這樣做的方法。 我認爲可能的解決方案是覆蓋服務安裝程序的beforeuninstall方法,找到附加到我的GUI應用程序的進程並以編程方式將其終止。如果這個解決方案更好,我怎麼能實現它? 謝謝。

+0

在「登錄到同一臺計算機上的多個用戶」情況下(例如,如果啓用了快速用戶切換或遠程桌面等),可能會有*多個* GUI實例應用運行? –

+0

@Damien_The_Unbeliever: 沒有什麼可以防止這種情況發生,但它不是強制性的。 – Alex

回答

0

我想如果你已經卸載了服務,那麼可能有異常。你需要處理的異常。你只有其他選擇是某種形式的從服務到UI的卸載通知,但似乎過於複雜。只處理任何異常並整理任何資源

相關問題