gpt4 book ai didi

asynchronous - Fsharpx Async.AwaitObservable 不调用取消继续

转载 作者:行者123 更新时间:2023-12-04 20:02:40 25 4
gpt4 key购买 nike

我正在尝试使用 Fsharpx' Async.AwaitObservable在使用 Async.StartWithContinuations 启动的异步工作流中.出于某种原因,如果用于启动此工作流的取消 token 在等待 observable 时被取消(但不是在工作流的其他部分期间),则永远不会调用取消延续。但是,如果我把它放在 use! __ = Async.OnCancel (interruption) 中,然后中断函数确实被调用。有人可以澄清为什么会发生这种情况,最好的方法是什么,并确保始终调用其中一个延续函数?

open System
open System.Reactive.Linq
open FSharp.Control.Observable
open System.Threading

[<EntryPoint>]
let main _ =
let cancellationCapability = new CancellationTokenSource()

let tick = Observable.Interval(TimeSpan.FromSeconds 1.0)
let test = async {
let! __ = Async.AwaitObservable tick
printfn "Got a thing." }

Async.StartWithContinuations(test,
(fun () -> printfn "Finished"),
(fun exn -> printfn "Error!"),
(fun exn -> printfn "Canceled!"),
cancellationCapability.Token)

Thread.Sleep 100
printfn "Cancelling..."
cancellationCapability.Cancel()

Console.ReadLine() |> ignore
0 // return an integer exit code

最佳答案

在我看来,如何实现 AwaitObservable 也是一个问题。祝你好运。

也就是说,您可以在客户端代码中使用的一种解决方法是将 AwaitObservable 包装在一个任务中:

async {
let! ct = Async.CancellationToken
let! __ =
Async.StartAsTask(Async.AwaitObservable tick, cancellationToken = ct)
|> Async.AwaitTask
printfn "Got a thing."
}

不理想,但有效。

关于asynchronous - Fsharpx Async.AwaitObservable 不调用取消继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28250201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com