2011-01-18 6 views
1

コンソールアプリケーションが終了したときに特定の関数を実行したいと思います。私は多くの解決策を見つけましたが、どれも私のために働いていません。次のコードでCancelKeyPressなどが表示されないのはなぜですか?コンソールをonExitイベントを使って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」を押すか、私はあなたの例を実行すると1が動作するように、それは、「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の前にハンドラを登録する必要があるため)。とにかく動作するはずです1つの簡単なオプションがtry .. finally内全体main機能をラップすることです

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

:以下は、最初の10枚のCtrl + Cプレスした後、次の1の終了がキャンセルされます。以下のような何か:

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

私はあなたの第二の例を実行すると、私はファイルを取得EDITを:

Starting a Test 2 
Try Finally 
ProcessExit 

私はDomainUnloadedが印刷されていない理由はわからないんだけど、残りの期待どおりに動作するはずです。

+0

こんにちは、提案していただきありがとうございますが、動作していないようです。私の最初の投稿を参照してください –

+0

ありがとうreadLineの問題を指摘してください。それは私のコードで間違っていたものです。私は最初にProcess.WaitForExit()を呼び出し、その時だけハンドラを登録していました:) –

関連する問題