2016-04-06 3 views
0

Я не пользователь pro wpf, поэтому я пришел сюда, чтобы попросить вас о помощи. Я хочу обновить некоторое значение БД, когда приложения выходят, но ничего не происходит. вот мой App.xaml код:Событие выхода WPF app.xaml не работает

<Application x:Class="pcAdmin.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:local="clr-namespace:pcAdmin" 
      Startup="Application_Startup" Exit="Application_Exit" 
      > 
    <Application.Resources> 

    </Application.Resources> 
</Application> 

и вот код позади от Application_Exit Methode:

private void Application_Exit(object sender, ExitEventArgs e) 
      { 
//just for verification 
       System.Windows.Forms.MessageBox.Show("apps is shutting down"); 
//updating DB 
       conDB = new MySQLConnect(this.connexion_string); 
       conDB.connectDB(); 
       conDB.updateStatus("OFF", IP.mac); 
       conDB.disconnect(); 
       pw.requestStop(); 
      } 

NB: - нет ошибок со всеми fonction в application_exit, потому что они работают отлично в другой части программы. - у приложений нет окна, поэтому я не могу использовать windows_closing или событие windows_closed (но попробовал его с ними и работу с кодом) Буду очень благодарен вам за помощь. Спасибо

Вот полный код кода app.xaml за

public partial class App : System.Windows.Application 
    { 
     private string pData; 
     private string pDataPath; 
     private NotifyIcon nIcon; 
     private string connexion_string; 
     private string host; 
     private string user; 
     private string pwd; 
     private string base_sql; 
     private InfoPC IP; 
     private MySQLConnect conDB; 
     private IPChangeDetect ipc; 
     private ProcessWorker pw; 
     private Programme programme; 
     private Service services; 
     private List<Svc> sc; 
     private AV antivirus; 
     private Processor processor; 

     private void Application_Startup(object sender, StartupEventArgs e) 
     { 
      this.pData = "%ALLUSERSPROFILE%"; 
      this.pDataPath = Environment.ExpandEnvironmentVariables(pData); 
      //chargement de l'icon dans la barre de tâche 
      nIcon = new NotifyIcon(); 
      this.nIcon.Icon = new Icon(@"D:\sav Jerrys\pro\getInfo2.0\pcAdmin\pcAdmin\logo.ico"); 
      nIcon.Visible = true; 
      nIcon.BalloonTipText = "Gathering PC info"; 
      nIcon.BalloonTipTitle = "AEthernam"; 
      nIcon.ShowBalloonTip(5000); 
      //mise à jour de l'application 
      getUpdated(); 
      //obtention des paramètres de connexion à la base de donnée 
      recupParam(); 
      //connexion à la base de donnée et envoi des information pendant le chargement de pcAdmin 
      connexion_string = "Server=" + this.host + ";Uid=" + this.user + ";password=" + this.pwd + ";database=" + this.base_sql + ";port=3306"; 
      this.IP = new InfoPC(); 
      IP.find_info(); 
      conDB = new MySQLConnect(connexion_string, IP.mac, IP.ip, IP.domaine, IP.nom); 
      conDB.connectDB(); 
      conDB.sendData(); 
      //detection du changement d'ip après le chargement du logiciel 
      ipc = new IPChangeDetect(conDB); 
      ipc.detectIPChange(); 
      conDB.disconnect(); 

      //THread for listing process 
      pw = new ProcessWorker(connexion_string, IP.mac, pDataPath + @"\AEthernam\proc.bin"); 
      Thread processThread = new Thread(pw.processWorker); 
      processThread.IsBackground = true; 
      processThread.Start(); 
      while (!processThread.IsAlive) ; 

      //récupération de la liste des programmes 
      recupProg(); 
      //récupération des services 
      recupService(); 
      //récupération AV 
      recupAV(); 
      //Recup info processeur 
      recupProcInfo(); 
      //TODO:Recup info disque dur physique 
      recupPhyDiskInfo(); 
      //TODO:Recup info partition 
      recupLogDiskInfo(); 
      //TODO:Recup info Mémoire 
      recupMemoryInfo(); 
     } 
     private void getUpdated() 
     { 

      // StreamWriter sw = new StreamWriter(pDataPath + "\\AEthernam\\aethernam.log"); 
      Version appsVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; 
      UpdateChecker upChecker = new UpdateChecker(appsVersion.ToString()); 
      upChecker.checkUpdate(); 
      //try 
      //{ 
      // sw.WriteLine(upChecker.getLog); 
      //} 
      //catch(Exception ex) 
      //{ 
      // this.log = "erreur ajout log dans le fichier log:\t" + ex.Message; 
      //} 
     } 

     private void recupParam() 
     { 
      try 
      { 
       StreamReader sr = new StreamReader(pDataPath + "\\AEthernam\\aethernam.cfg"); 
       string ligne = sr.ReadLine(); 
       this.host = ligne; 
       ligne = sr.ReadLine(); 
       this.user = ligne; 
       ligne = sr.ReadLine(); 
       this.pwd = ligne; 
       ligne = sr.ReadLine(); 
       this.base_sql = ligne; 
      } 
      catch (Exception ex) 
      { 
       System.Windows.MessageBox.Show(ex.Message); 
      } 
     } 
     private void recupProg() 
     { 
      programme = new Programme(); 
      List<prog> liste_programe = programme.recupProg(); 
      conDB = new MySQLConnect(connexion_string, IP.mac); 
      conDB.connectDB(); 
      if (System.IO.File.Exists(pDataPath + @"\AEthernam\prog.bin")) 
      { 
       List<prog> list_pro = programme.deserialize(pDataPath + @"\AEthernam\prog.bin"); 
       if (list_pro.Count != liste_programe.Count) 
       { 
        //mise à jour de la base des programmes 
        conDB.update_Prog(IP.mac, liste_programe); 
        conDB.disconnect(); 
        programme.serialize(list_pro, pDataPath + @"\AEthernam\prog.bin"); 
       } 
      } 
      else 
      { 
       conDB.sendProg(liste_programe); 
       conDB.disconnect(); 
       programme.serialize(liste_programe, pDataPath + @"\AEthernam\prog.bin"); 
      } 
     } 
     private void recupService() 
     { 
      this.services = new Service(); 
      sc = services.getSvc(); 
      conDB = new MySQLConnect(connexion_string, IP.mac); 
      conDB.connectDB(); 
      if (System.IO.File.Exists(pDataPath + @"\AEthernam\svc.bin")) 
      { 
       List<Svc> svcs = services.deserialize(pDataPath + @"\AEthernam\svc.bin"); 
       if (svcs.Count != sc.Count) 
       { 
        //Mise à jour de la base des sevices 
        conDB.updateService(IP.mac, svcs); 
        conDB.disconnect(); 
        services.serialize(svcs, pDataPath + @"\AEthernam\svc.bin"); 
       } 
      } 
      else 
      { 
       //insertion des services dans la base 
       conDB.sendService(sc); 
       conDB.disconnect(); 
       services.serialize(sc, pDataPath + @"\AEthernam\svc.bin"); 
      } 
     } 
     private void recupAV() 
     { 
      List<AV> listAv = new List<AV>(); 
      FindAv avInstallé = new FindAv(); 
      ManagementObjectCollection avs = avInstallé.AvInstalled(); 
      foreach (ManagementObject mo in avs) 
      { 
       antivirus = new AV(); 
       antivirus.nom = mo["DisplayName"].ToString(); 
       antivirus.etat = avInstallé.findState(mo["productState"].ToString()); 
       listAv.Add(antivirus); 
      } 
      conDB = new MySQLConnect(connexion_string, IP.mac); 
      conDB.connectDB(); 
      if (!System.IO.File.Exists(pDataPath + @"\AEthernam\prog.bin")) 
      { 
       foreach (AV av in listAv) 
       { 
        conDB.sendAV(av); 
        conDB.disconnect(); 

       } 

      } 
      else 
      { 
       conDB.updateAV(IP.mac, listAv); 
       conDB.disconnect(); 
      } 
     } 
     private void recupMemoryInfo() 
     { 
      List<Ram> liste_ram = new List<Ram>(); 
      liste_ram = new RamInfo().getRams(); 
      conDB = new MySQLConnect(connexion_string, IP.mac); 
      conDB.connectDB(); 
      if (!System.IO.File.Exists(pDataPath + @"\AEthernam\prog.bin")) 
      { 
       conDB.sendRam(liste_ram); 
       conDB.disconnect(); 
      } 
      else 
      { 
       conDB.updateRam(IP.mac, liste_ram); 
       conDB.disconnect(); 
      } 
     } 
     private void recupPhyDiskInfo() 
     { 
      List<DisquePhysique> liste_pdisk = new List<DisquePhysique>(); 
      liste_pdisk = new PhysicalDiskInfo().getPDisk(); 
      conDB = new MySQLConnect(connexion_string, IP.mac); 
      conDB.connectDB(); 
      if (!System.IO.File.Exists(pDataPath + @"\AEthernam\prog.bin")) 
      { 
       conDB.sendPhydisque(liste_pdisk); 
       conDB.disconnect(); 
      } 
      else 
      { 
       conDB.updatePhydisque(IP.mac, liste_pdisk); 
       conDB.disconnect(); 
      } 
     } 
     private void recupLogDiskInfo() 
     { 
      List<LogicalDisk> liste_ldisk = new List<LogicalDisk>(); 
      liste_ldisk = new LogicalDiskInfo().getPartition(); 
      conDB = new MySQLConnect(connexion_string, IP.mac); 
      conDB.connectDB(); 
      if (!System.IO.File.Exists(pDataPath + @"\AEthernam\prog.bin")) 
      { 
       conDB.sendLdisque(liste_ldisk); 
       conDB.disconnect(); 
      } 
      else 
      { 
       conDB.updateLdisque(IP.mac, liste_ldisk); 
       conDB.disconnect(); 
      } 
     } 
     private void recupProcInfo() 
     { 
      processor = new Processor(); 
      ProcessorInfo pInfo = new ProcessorInfo(); 
      processor = pInfo.getInfo(); 
      conDB = new MySQLConnect(connexion_string, IP.mac); 
      conDB.connectDB(); 
      if (!System.IO.File.Exists(pDataPath + @"\AEthernam\prog.bin")) 
      { 
       conDB.sendProcessor(processor); 
       conDB.disconnect(); 
      } 
      else 
      { 
       conDB.updateProcessor(IP.mac, processor); 
       conDB.disconnect(); 
      } 
     } 

     private void Application_Exit(object sender, ExitEventArgs e) 
     { 
      System.Windows.Forms.MessageBox.Show("apps is shutting down"); 
      conDB = new MySQLConnect(this.connexion_string); 
      conDB.connectDB(); 
      conDB.updateStatus("OFF", IP.mac); 
      conDB.disconnect(); 
      pw.requestStop(); 
     } 
    } 
+0

Что это за приложение, если у вас нет окна? – Nitin

+0

Измените System.Windows.Forms.MessageBox.Show() на MessageBox.SHow() и почему вы используете Windows.Forms внутри приложения WPF? –

+0

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

ответ

0

У меня есть ощущение, что проблема связана с нитью у вас есть. Если это foreground thread, это не позволяет программе выйти до ее запуска. И поскольку вы пытаетесь остановить его в методе Exit_Application, этого никогда не происходит. Попробуйте установить где-нибудь, где вы создаете поток.

pw.IsBackground = true; 

Если вы используете новую тему Thread() для ее создания, она всегда имеет значение по умолчанию для переднего плана.

UPDATE:

Поскольку приложение закрывается из диспетчера задач, процесс просто убит окнами и нет никакого способа, чтобы выполнить код до его закрытия. Проверьте это answer для обходного пути, включая DB. Или вам понадобится хотя бы некоторый пользовательский интерфейс или значок в трее, что позволит вам закрыть приложение с помощью одного нажатия кнопки. Чтобы корректно закрыть приложение, которое вы можете использовать предложенный ранее:

Application.Current.Shutdown(); 
+0

Благодарю вас за ответ, я изменил свой код, как вы предлагали, но не сработал. здесь приведен пример кода потока, который запускался –

+0

// THread for listing process pw = new ProcessWorker (connexion_string, IP.mac, pDataPath + @ "\ AEthernam \ proc.bin"); Thread processThread = new Thread (pw.processWorker); processThread.IsBackground = true; processThread.Start(); while (! ProcessThread.IsAlive); –

+0

проблема в том, что мне не нужно закрывать приложения, мне нужно отправить данные в db, говоря, что пользователь остановил приложения :) в этом случае только убив процесс –

0

Просто сделайте следующее:

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    //your current code 
    Application.Current.Shutdown(); 
} 

это должно вызвать метод выхода из приложения и запустить код в application_exit();

0

Спасибо всем за ваш ответ и помощь, я отвечу @ 3615 как приемлемое решение для меня. Я найду способ узнать, не убил ли пользователь процесс, а затем обновил мою БД.

 Смежные вопросы

  • Нет связанных вопросов^_^