我对使用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 …