2011-01-18 2 views
1

콘솔 응용 프로그램이 종료 될 때 특정 기능을 실행하고 싶습니다. 나는 많은 해결책을 찾았지 만 그들 중 누구도 나를 위해 일하지 않습니다. 다음 코드가 CancelKeyPress 등을 표시하지 않는 이유는 무엇입니까?F를 사용하여 콘솔에서 끝내기 이벤트 #

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"또는 나는 그것이 "ProcessExit"을 인쇄하여 예제를 실행하면 "닫기 버튼"

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" 

답변

2

클릭 그래서 하나가 작동하는지. "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 

어쨌든 것 작동해야 하나 간단한 옵션은 try .. finally 내부 전체 main 기능을 포장. 뭔가 같은 : 나는 당신의 두 번째 예제를 실행하면

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

편집, 내가 가진 파일 얻을 다음 DomainUnloaded가 인쇄되지 않은 이유를 잘 모르겠어요

Starting a Test 2 
Try Finally 
ProcessExit 

을하지만, 나머지 예상대로 작동해야합니다.

+0

안녕하세요, 제안 주셔서 감사하지만 작동하지 않는 것 같습니다. 내 첫 번째 게시물을 참조하십시오. –

+0

ReadLine 문제를 지적 해 주셔서 감사합니다. 그것이 내 코드에서 잘못된 것입니다. 먼저 Process.WaitForExit()을 호출하고 그때 만 처리기를 등록했습니다. :) –

관련 문제