Консоль onExit событий с использованием F # - PullRequest
1 голос
/ 18 января 2011

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

printfn "Starting a Test"
System.Console.ReadLine() |> ignore
System.Console.CancelKeyPress.Add (fun _ -> printfn "CancelKeyPress" )
System.AppDomain.CurrentDomain.ProcessExit.Add (fun _ -> printfn "ProcessExit" )
System.AppDomain.CurrentDomain.DomainUnload.Add (fun _ -> printfn "DomainUnload" )

Я немного изменил свой код и добавил оператор try finally, но безуспешно.Я запускаю приложение и затем нажимаю «Ctrl + C» или нажимаю «Закрыть»

let write v = System.IO.File.AppendAllText("test.txt", v + "\n")
try
  write "Starting a Test 2"
  System.Console.ReadLine() |> ignore
  System.Console.CancelKeyPress.Add (fun _ -> write "CancelKeyPress" )
  System.AppDomain.CurrentDomain.ProcessExit.Add (fun _ -> write "ProcessExit" )
  System.AppDomain.CurrentDomain.DomainUnload.Add (fun _ -> write "DomainUnload" )
finally
  write "Try Finally"

1 Ответ

3 голосов
/ 18 января 2011

Когда я запускаю ваш пример, он печатает «ProcessExit», чтобы он работал.Причина, по которой «CancelKeyPress» не печатается, заключается в том, что приложение, вероятно, завершает работу до того, как оно произойдет (и вам также необходимо зарегистрировать обработчик до ReadLine).Следующее действие отменит первые 10 Ctrl + C нажатий и затем завершит работу на следующем:

Console.CancelKeyPress.Add(fun arg -> 
  printfn "CancelKeyPress"; arg.Cancel <- true ) 
for i in 0 .. 10 do 
  System.Console.ReadLine() |> ignore 

В любом случае, одним простым вариантом, который должен сработать, будет завершение всей функции main внутри try .. finally.Что-то вроде:

let main (args) = 
  try
    // run the application
  finally
    // finalization code here

РЕДАКТИРОВАТЬ Когда я запускаю ваш второй пример, я получаю файл с:

Starting a Test 2
Try Finally
ProcessExit

Я не уверен, почему DomainUnloaded не был напечатан, но остальные должны работать как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...