gpt4 book ai didi

F# 如何停止 Async.Start

转载 作者:行者123 更新时间:2023-12-04 01:14:43 26 4
gpt4 key购买 nike

您好,我有一个关于 F# 中异步的问题。

所以我有一个在后台运行的简单过程,它被放置在一个类型的成员中,它看起来像:

type Sender() = 
member this.Start(udpConectionPool) = async {
(* Some operation that continuously sends something over udp*)
} |> Async.Start

所以这开始并开始通过 UDP 连续发送帧而不会阻塞程序的其余部分,但有时我想重新启动线程(假设我想添加新的端点,它会发送到那个是 udpConnectionPool 参数)。

我在考虑类似将任务转储给成员的事情,然后:

member this.Stop() = async {
do! (*stop async start member that contains task*)
}

然后我可以使用更新的连接池重新启动此任务,但我不知道我是否可以这样做。

我的问题是,是否可以停止这样的任务,或者如果不能,是否有更好的方法来做到这一点?

最佳答案

取消 F# 异步工作流的标准方法是使用 CancellationToken。当您调用 Async.Start 时,您可以提供一个取消标记。当 token 被取消时,异步工作流将停止(当前阻塞工作完成后):

open System.Threading

let cts = new CancellationTokenSource()
let work = async { (* ... *) }
Async.Start(work, cts.Token)

cts.Cancel() // Sometime later from another thread

要将它与 Sender 集成,您可以存储当前的 CancellationTokenSource 并使用 Stop 方法来取消它(如果您想要将其保存在有状态的类中)。或者,您可以从 Start 方法返回 IDisposable,其方式类似于 Observable 接口(interface)的工作方式:

type Sender () = 
member this.Start(udpConnectionPool) =
let cts = new CancellationTokenSource()
let work = async { (* ... *) }
Async.Start(work, cts.Token)
{ new System.IDisposable with
member x.Dispose() = cts.Cancel() }

这样,Start 的调用者负责存储返回的 IDisposable 并在再次调用 Start 之前释放它。

关于F# 如何停止 Async.Start,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63741463/

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