【问题标题】:Console onExit events using F#使用 F# 控制台 onExit 事件
【发布时间】:2011-01-18 13:23:54
【问题描述】:

我希望在控制台应用程序退出时执行某个功能。我找到了很多解决方案,但没有一个对我有用。为什么下面的代码不显示 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"

【问题讨论】:

    标签: .net f# console


    【解决方案1】:

    当我运行您的示例时,它会打印“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 没有打印出来,但其余的应该可以按预期工作。

    【讨论】:

    • 您好,感谢您的建议,但它似乎不起作用。查看我的第一篇文章
    • 非常感谢您指出 readLine 问题。这就是我的代码中的错误。我首先调用 Process.WaitForExit(),然后才注册处理程序 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多