我有一个我想运行的Async<'T>
计算,并获得结果'T
。
我只有两个要求:
- 在某些
timeout:TimeSpan
通过后,我希望计算/IO被中止。 - 我想用
cancellationToken
运行它,以防万一我想在timeout
通过之前中止它。
根据我的要求(1),您可能会认为Async.StartChild
是一个很好的候选人,因为它接受了超时参数,但是,它不接受concellationToken参数!
看来,API中接受concellationToken中的其他Async.
方法要么不返回任何东西(因此我不能等待结果),或者仅适用于Async<unit>
,或者不允许我使用一种方法来组合它使用异步。Startchild达到我的两个要求。
另外,我需要在async{}
块中实现此功能,这意味着在其中使用Async.RunSynchronously
(以防万一您建议这样做)看起来很有问题或丑陋。
我在俯瞰什么吗?
谢谢!
如Hvester的评论中所述,在启动子计算时,您无需通过取消词。它将由父母共享,并将取消两者,例如,请参见此处。
let work dueTime = async{
do! Async.Sleep dueTime
printfn "Done" }
let workWithTimeOut timeForWork timeOut = async{
let! comp = Async.StartChild(work timeForWork, timeOut)
return! comp }
workWithTimeOut 200 400 |> Async.Start // prints "Done"
workWithTimeOut 400 200 |> Async.Start // throws System.TimeoutException
let cts = new System.Threading.CancellationTokenSource()
Async.Start(workWithTimeOut 400 200, cts.Token)
System.Threading.Thread.Sleep 100
cts.Cancel() // throws System.OperationCanceledException