相关疑难解决方法(0)

F#Async <'T>取消的工作原理是什么?

我对使用TPL在C#中完成异步取消的方式非常满意,但我对F#有点困惑.通过呼叫显然Async.CancelDefaultToken()足以取消传出的Async<'T>操作.但它们没有像我预期的那样被取消,它们只是......消失了...我无法正确检测到取消并正确拆除堆栈.

例如,我有这个代码依赖于使用TPL的C#库:

type WebSocketListener with
  member x.AsyncAcceptWebSocket = async {
    let! client = Async.AwaitTask <| x.AcceptWebSocketAsync Async.DefaultCancellationToken
    if(not(isNull client)) then
        return Some client
    else 
        return None
  }

let rec AsyncAcceptClients(listener : WebSocketListener) =
  async {
    let! result = listener.AsyncAcceptWebSocket
    match result with
        | None -> printf "Stop accepting clients.\n"
        | Some client ->
            Async.Start <| AsyncAcceptMessages client
            do! AsyncAcceptClients listener
  }
Run Code Online (Sandbox Code Playgroud)

CancellationToken传递给x.AcceptWebSocketAsync取消时,返回null,然后AsyncAcceptWebSocket返回方法None.我可以通过断点验证这一点.

但是,AsyncAcceptClients(调用者),永远不会获得该None …

f# cancellation f#-3.0 f#-async

10
推荐指数
1
解决办法
1380
查看次数

标签 统计

cancellation ×1

f# ×1

f#-3.0 ×1

f#-async ×1