F#热停止异步。启动

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连续发送

嗨,我有一个关于F#中异步的问题

因此,我有一个简单的过程,它在Background中运行,放置在一个类型的membert中,它看起来像:

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() }