异步启动超时和取消token



我有一个我想运行的Async<'T>计算,并获得结果'T

我只有两个要求:

  1. 在某些timeout:TimeSpan通过后,我希望计算/IO被中止。
  2. 我想用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

相关内容

  • 没有找到相关文章

最新更新