F#热停止异步。启动
嗨,我有一个关于F#中异步的问题 因此,我有一个简单的过程,它在Background中运行,放置在一个类型的membert中,它看起来像:F#热停止异步。启动,f#,F#,嗨,我有一个关于F#中异步的问题 因此,我有一个简单的过程,它在Background中运行,放置在一个类型的membert中,它看起来像: type Sender () = member this.Start udpConectionPool = async { (* ome operation that continusly send something to throu udp*) } |> Async.Start 因此,这会启动并开始通过UDP连续发送
type Sender () =
member this.Start udpConectionPool =
async { (* ome operation that continusly send something to throu udp*) } |> Async.Start
因此,这会启动并开始通过UDP连续发送帧,而不会阻塞程序的其余部分,但有时我想重新启动线程(假设我想添加它将发送到的新端点,即udpConectionPool参数)
我想把任务交给会员,然后:
member this.Stop = async { do! (*stop async start member that contains task*)}
然后,我可以用更新的连接池重新启动此任务,但我不知道是否可以这样做。
我的问题是,是否有可能停止此类任务,或者如果没有,是否有更好的方法来完成此任务?取消异步工作流的标准方法是使用
取消令牌。调用Async.Start
时,可以提供取消令牌。当令牌被取消时,异步工作流将停止(在当前阻止工作完成后):
要将其与发送方
集成,您可以存储当前的CancellationTokenSource
,并使用停止
方法来取消它(如果您希望将其保留在有状态类中)。或者,您可以从Start
方法返回IDisposable
,返回方式类似于Observable
接口的工作方式:
type Sender () =
member this.Start udpConectionPool =
let cts = new CancellationTokenSource()
let work = async { (* ... *) }
Async.Start(work, cts.Token)
{ new System.IDisposable with
member x.Dispose() = cts.Cancel() }
这样,Start
的调用方负责存储返回的IDisposable
并在再次调用Start
之前将其处理掉
type Sender () =
member this.Start udpConectionPool =
let cts = new CancellationTokenSource()
let work = async { (* ... *) }
Async.Start(work, cts.Token)
{ new System.IDisposable with
member x.Dispose() = cts.Cancel() }