2015-02-25 3 views
0

Да, я знаю, - одна из следующих строк будет делать это, как правило:Выход из приложения Windows Forms?

AppDomain.CurrentDomain.ProcessExit += OnApplicationExit; 
Application.ApplicationExit += OnApplicationExit; 

void OnApplicationExit(object sender, EventArgs eventArgs) { ... } 

Но что, когда один не использовать какие-либо формы в приложении WinForms? Сделать это скрыто приложение для Windows - это не сервис. Оба приведенных выше примера не работают для меня.

Вот как я запускаю свое приложение WinForms. Как вы можете видеть, что я не прохожу какую-либо формы к методу Run

public static void Main() 
{ 
    InitMyApp(); 
    // Here I tried to subscribe to the above shown events => didn't work. 
    Application.Run(); 
} 
+1

'AppDomain.ProcessExit' отлично работает для меня в консольном приложении (то есть без форм). В вашем примере нет попытки использовать метод _either_. Пожалуйста, укажите [хороший, _minimal_, _complete_ пример кода] (http://stackoverflow.com/help/mcve), который наглядно иллюстрирует ваш вопрос. –

+0

@PeterDuniho Ну нет способа сделать скрытое консольное приложение - AFAIK. Вот почему я специально спросил WinForms. Создайте проект WinForms и удалите содержимое 'Main()' и просто сделайте 'Application.Run()' =>, он будет запущен, но * скрыт *. Обновлен мой вопрос, чтобы сделать вещи, надеюсь, более ясными – Brettetete

+0

Это может помочь? http://stackoverflow.com/questions/20675024/when-will-appdomain-processexit-not-get-called и http://stackoverflow.com/questions/1157009/application-exit-even-not-firing-in- c-sharp-windows-application –

ответ

0

Thread.GetDomain(). ProcessExit работал в этом направлении.

using System; 
using System.ComponentModel; 
using System.Threading; 
using System.Windows.Forms; 

namespace Test 
{ 
    class MainClass 
    { 
     public static void Main (string[] args) 
     { 
      Thread.GetDomain().ProcessExit += (object sender, EventArgs e) => { 
       Console.WriteLine ("Foo!"); 
      }; 
      BackgroundWorker autokill = new BackgroundWorker(); 
      autokill.DoWork += (object sender, DoWorkEventArgs e) => { 
       Thread.Sleep (5000); 
       Environment.Exit (0); 
      }; 
      autokill.RunWorkerAsync(); 
      Application.Run(); 
     } 
    } 
} 
Смежные вопросы