Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.21.76.0] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте,
Мне нужно обработать закрытие консольного приложения (то есть когда пользователь нажимает кнопку закрытия консоли или завершает процесс в таскменеджере), но что-то не могу понять где искать ивент который за это отвечает. пробовал вешать try catch finally в методе main, но finally не срабатывает... пробовал получить ссылку на текущий процесс : System.Diagnostics.Process myProcess = System.Diagnostics.Process.GetCurrentProcess(); и потом использовать ивент myProcess.Exited, но он тоже не срабатывает... подскажите, пожалуйста, как решить вопрос. нужно это для того, чтобы при закрытии приложения сохранить информацию в файл. заранее спасибо. |
Сообщ.
#2
,
|
|
|
По заголовку не возможно найти, по таймеру?
|
Сообщ.
#3
,
|
|
|
Если процесс убивают, то только сторонним процессом отловишь.
|
Сообщ.
#4
,
|
|
|
coder, не понял чего делать. расскажи, пожалуйста, подробнее или скажи что набрать в поиске МСДН
Spawn.NET, это ты говоришь про закрытие проги из таскмэнеджера или про закрытие консоли "крестиком" тоже?? есть вариант сделать из консольного приложения приложение ВинФормс и там обрабатывать закрытие формы, но это вообще на крайняк... |
Сообщ.
#5
,
|
|
|
Цитата Junior_Coder @ Spawn.NET, это ты говоришь про закрытие проги из таскмэнеджера или про закрытие консоли "крестиком" тоже?? У меня такое подозрение, что в случае с консолью это одно и то же. Почему именно консольное приложение требуется? |
Сообщ.
#6
,
|
|
|
оно не требуется, просто оно есть. если делать из него ВинФормс, то нужно будет писать море делегатов с Invoke и т.д....
|
Сообщ.
#7
,
|
|
|
Можно относительно просто использовать уже имеющийся в Kernel32.dll механизм.
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 } } |
Сообщ.
#8
,
|
|
|
Vladimir,
в моём приложении выскакивает вот такое исключение, когда использую код который вы выложили. CallbackOnCollectedDelegate was detected Message: Был произведен обратный вызов делегата типа "MyApp!MyApp.Program+HandlerRoutine::Invoke", полученного сборщиком мусора. Это может привести к сбоям приложения, а также к повреждению или утрате данных. При передаче делегатов в неуправляемый код управляемое приложение должно поддерживать их существование, пока не будет гарантировано, что они больше никогда не будут вызваны. хотя отдельно, конечно, работает прекрасно. но почему-то не всегда. иногда выскакивает то же самое исключение. есть варианты в чём дело? (мой код нет смысла выкладывать: там очень много всего) |
Сообщ.
#9
,
|
|
|
Это вызвано использованием неуправляемых функций в управляемом коде. Почитай про GC.KeepAlive, ну или в лямбда выражение можно выкинуть вызов функции неуправляемой, что обычно помогает
|
Сообщ.
#10
,
|
|
|
Спасибо, почитаю
|
Сообщ.
#11
,
|
|
|
Цитата Junior_Coder @ в моём приложении выскакивает вот такое исключение, когда использую код который вы выложили. CallbackOnCollectedDelegate was detected http://msdn.microsoft.com/en-us/library/system.gc.keepalive.aspx |