На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Закрытие консольного приложения , C# console App
    Здравствуйте,

    Мне нужно обработать закрытие консольного приложения (то есть когда пользователь нажимает кнопку закрытия консоли или завершает процесс в таскменеджере), но что-то не могу понять где искать ивент который за это отвечает.

    пробовал вешать try catch finally в методе main, но finally не срабатывает...

    пробовал получить ссылку на текущий процесс :

    System.Diagnostics.Process myProcess = System.Diagnostics.Process.GetCurrentProcess();

    и потом использовать ивент myProcess.Exited, но он тоже не срабатывает...

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

    заранее спасибо.
      По заголовку не возможно найти, по таймеру?
        Если процесс убивают, то только сторонним процессом отловишь.
          coder, не понял чего делать. расскажи, пожалуйста, подробнее или скажи что набрать в поиске МСДН

          Spawn.NET, это ты говоришь про закрытие проги из таскмэнеджера или про закрытие консоли "крестиком" тоже??

          есть вариант сделать из консольного приложения приложение ВинФормс и там обрабатывать закрытие формы, но это вообще на крайняк...
            Цитата Junior_Coder @
            Spawn.NET, это ты говоришь про закрытие проги из таскмэнеджера или про закрытие консоли "крестиком" тоже??

            У меня такое подозрение, что в случае с консолью это одно и то же.
            Почему именно консольное приложение требуется?
              оно не требуется, просто оно есть. если делать из него ВинФормс, то нужно будет писать море делегатов с Invoke и т.д....
                Можно относительно просто использовать уже имеющийся в Kernel32.dll механизм.

                ExpandedWrap disabled
                  using System;
                  using System.Collections.Generic;
                  using System.Linq;
                  using System.Text;
                  using System.Runtime.InteropServices;
                   
                  namespace ClosingEvent
                  {
                      class Program
                      {
                          private static bool isclosing = false;
                   
                   
                          static void Main(string[] args)
                          {
                              SetConsoleCtrlHandler(new HandlerRoutine(ConsoleCtrlCheck), true);
                   
                   
                   
                              Console.WriteLine("CTRL+C,CTRL+BREAK or suppress the application to exit");
                   
                              while (!isclosing) ;
                   
                   
                          }
                   
                          private static bool ConsoleCtrlCheck(CtrlTypes ctrlType)
                          {
                   
                              switch (ctrlType)
                              {
                                  case CtrlTypes.CTRL_C_EVENT:
                                      Console.WriteLine("CTRL+C received!");
                                      isclosing = true;
                                      break;
                   
                                  case CtrlTypes.CTRL_BREAK_EVENT:
                                      Console.WriteLine("CTRL+BREAK received!");
                                      isclosing = true;
                                      break;
                   
                   
                                  case CtrlTypes.CTRL_CLOSE_EVENT:
                                      Console.WriteLine("Program being closed!");
                                      isclosing = true;
                                      break;
                   
                                  case CtrlTypes.CTRL_LOGOFF_EVENT:
                                  case CtrlTypes.CTRL_SHUTDOWN_EVENT:
                                      Console.WriteLine("User is logging off!");
                                      isclosing = true;
                                      break;
                   
                              }
                   
                              return true;
                   
                          }
                   
                   
                          #region unmanaged
                   
                          // Declare the SetConsoleCtrlHandler function
                          // as external and receiving a delegate.
                   
                          [DllImport("Kernel32")]
                          public static extern bool SetConsoleCtrlHandler(HandlerRoutine Handler, bool Add);
                   
                   
                          // A delegate type to be used as the handler routine
                          // for SetConsoleCtrlHandler.
                          public delegate bool HandlerRoutine(CtrlTypes CtrlType);
                   
                   
                   
                          // An enumerated type for the control messages
                          // sent to the handler routine.
                   
                          public enum CtrlTypes
                          {
                   
                              CTRL_C_EVENT = 0,
                              CTRL_BREAK_EVENT,
                              CTRL_CLOSE_EVENT,
                              CTRL_LOGOFF_EVENT = 5,
                              CTRL_SHUTDOWN_EVENT
                   
                          }
                   
                   
                   
                          #endregion
                   
                   
                      }
                  }
                  Vladimir,

                  в моём приложении выскакивает вот такое исключение, когда использую код который вы выложили.

                  CallbackOnCollectedDelegate was detected
                  Message: Был произведен обратный вызов делегата типа "MyApp!MyApp.Program+HandlerRoutine::Invoke", полученного сборщиком мусора. Это может привести к сбоям приложения, а также к повреждению или утрате данных. При передаче делегатов в неуправляемый код управляемое приложение должно поддерживать их существование, пока не будет гарантировано, что они больше никогда не будут вызваны.

                  хотя отдельно, конечно, работает прекрасно. но почему-то не всегда. иногда выскакивает то же самое исключение.

                  есть варианты в чём дело? (мой код нет смысла выкладывать: там очень много всего)
                  Сообщение отредактировано: Junior_Coder -
                    Это вызвано использованием неуправляемых функций в управляемом коде. Почитай про GC.KeepAlive, ну или в лямбда выражение можно выкинуть вызов функции неуправляемой, что обычно помогает :)
                      Спасибо, почитаю
                        Цитата Junior_Coder @
                        в моём приложении выскакивает вот такое исключение, когда использую код который вы выложили.

                        CallbackOnCollectedDelegate was detected



                        http://msdn.microsoft.com/en-us/library/system.gc.keepalive.aspx
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0564 ]   [ 16 queries used ]   [ Generated: 26.04.24, 05:06 GMT ]