gpt4 book ai didi

asynchronous - F# Async.FromBeginEnd 不应该调用 End 函数?

转载 作者:行者123 更新时间:2023-12-02 03:58:38 24 4
gpt4 key购买 nike

我正在使用 F# 做一些低级别的套接字工作,并使一切异步。我有一个套接字,用于使用异步工作流来监听连接以处理它们,因此它使用它来包装 Socket.BeginListen() 和 Socket.EndListen()。

member socket.AsyncAccept () =
Async.FromBeginEnd( socket.BeginAccept, endOrDisposed socket.EndAccept null )

当我想停止收听时,目前我正在对其执行 Socket.Close() ,这将导致由 Socket.BeginAccept() 启动的异步操作完成。

最初我遇到了一个问题,因为无论 BeginXXX() 启动的操作如何完成,FromBeginEnd() 函数总是会调用 EndXXX() 函数。在某些情况下,这会导致 EndXXX() 函数发生 ObjectDisposed 异常,因为在调用它时,Socket 已被关闭并释放。我添加了一个小处理函数,可以过滤掉这些异常:
let endOrDisposed endFunc defaultResult iar = try endFunc iar with | _ -> defaultResult

这可以解决问题,但在调试中运行时不行。我很清楚 Just My Code 选项可用于隐藏异常,但这可能会更频繁地发生在其他一些 IO 操作中,因此我也不想将处理器时间浪费在引发和捕获不应该的异常上一开始就真的在那里。此外,我可能不想隐藏在我确实需要调试的区域中引发其他异常的位置。

我查看了 Async.FromBeginEnd 的代码,无论如何它总是调用 EndXXX() 函数,我不确定这是最好的行为,也许我应该写一个替代品?或者有人对优雅的解决方案有任何其他想法吗?

我刚刚在文档中发现(当然我以前看过)这个:

To cancel a pending call to the BeginAccept() method, close the Socket. When the Close() method is called while an asynchronous operation is in progress, the callback provided to the BeginAccept() method is called. A subsequent call to the EndAccept() method will throw an ObjectDisposedException to indicate that the operation has been cancelled.



我仍然不喜欢这个异常(exception),即使它是设计使然。我宁愿找到一种不在已处置对象上调用 EndXXX() 的方法。也许我可以以某种方式将一些 CancellationToken 魔法混入其中?

最佳答案

我会使用可选的 cancelAction Async.FromBeginEnd 的参数这里:

type Socket with
member this.AsyncAccept () =
let canceled = ref false
let endAccept iar = if not !canceled then this.EndAccept iar else null
let cancel () = canceled := true; this.Close ()
Async.FromBeginEnd (this.BeginAccept, endAccept, cancelAction = cancel)

这样你就可以使用 Async的内置取消功能(当然基于 CancellationToken )而无需触及 CancellationToken直接地。 (即,您应该 而不是 调用 Socket.Close 来取消。)

关于asynchronous - F# Async.FromBeginEnd 不应该调用 End 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11433941/

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