20. UIキューを隠ぺいする
UIキューに要求(ワーカースレッド起動)を入れ、結果をUI
キューから得るような f を考える。
let uiq = new Queue<(unit -> ‘U)>()
let f (action: Func<‘T, ‘U>) (argument: ‘T) (cps: ‘U -> unit) =
Thread.Execute(fun _ ->
let result = action(argument)
uiq.Enqueue result)
while true do
let result = uiq.Dequeue()
cps result
ワーカースレッドの起動
継続を実行
21. .NETにおいてのワーカースレッド
.NET標準のワーカースレッド起動は Task.Run() メソッド。
Task.Run() は Task<‘U> を返す。
TaskにはCPSを仕込む Task.ContinueWith() メソッドがある。
let uiq = new Queue<(unit -> ‘U)>()
let f (action: Func<‘T, ‘U>) (argument: ‘T) (cps: ‘U -> unit) =
let task = Task.Run<‘U>(fun _ -> action(argument))
task.ContinueWith(fun t -> uiq.Enqueue t.Result)
while true do
let result = uiq.Dequeue()
cps result
継続を実行
ワーカースレッド完了時に
キューに入れる