読者です 読者をやめる 読者になる 読者になる

F# の非同期ワークフローがよくわかってない

F#

F# 3.0で以下のコードが期待通りに動かない理由がよくわかってない。Ctrl+Cを押してもプログラムが終了してくれない。Wait()したままになる。

open System

[<EntryPoint>]
let main argv = 
    Async.StartAsTask(Async.AwaitEvent(Console.CancelKeyPress)).Wait()
    printfn "end"
    0

Wait()する前にConsole.CancelKeyPressに空のイベントハンドラを登録しとくと、期待通りに end と出力後にプログラムが終了してくれる。

open System

[<EntryPoint>]
let main argv = 
    Console.CancelKeyPress.Add(fun x -> ()) //これを追加すると期待通りに動く
    Async.StartAsTask(Async.AwaitEvent(Console.CancelKeyPress)).Wait()
    printfn "end"
    0

なんか使い方間違ってんのかな…?

追記

他のイベントでは期待通り動くし、Console.CancelKeyPressだけ特殊な雰囲気。詳細はMSに聞かないとわからないかも。