gpt4 book ai didi

f# - 如何在 F# 中执行链式回调?

转载 作者:行者123 更新时间:2023-12-02 06:45:08 25 4
gpt4 key购买 nike

在 C# 中,我使用的是 TcpListener/TcpClient 的异步版本,我通过回调方法将它们链接起来,以便在回调完成时发布另一个 Accept/Read。这是一个示例(未经测试):

    public void Start()
{
TcpListener listener = new TcpListener(IPAddress.Any, 3000);
listener.Start();

PostAccept(listener);
}

private void PostAccept(TcpListener listener)
{
listener.BeginAcceptTcpClient(AcceptCallback, listener);
}

private void AcceptCallback(IAsyncResult ar)
{
var listener = ar.AsyncState as TcpListener;

if (listener == null)
{
return;
}

// get the TcpClient and begin a read chain in a similar manner

PostAccept(listener);
}

我的问题是如何在 F# 中为类似的东西建模?我会使用 async 关键字吗? BeginAcceptTcpClient、BeginRead 等之后的代码本质上是将在回调函数中执行的代码吗?例如,这是正确的吗?

let accept(listener:TcpListener) = async {      
let! client = listener.AsyncAcceptTcpClient()
// do something with the TcpClient such as beginning a Read chain
accept(listener)
return()
}

上面的代码不起作用,因为没有定义 accept,并且从技术上讲,将其标记为递归是不正确的,因为它不是递归方法?

最佳答案

@kvb 的回答是正确且地道的。

还想指出您可以使用(喘气)循环:

let accept(t:TcpListener) =
let completed = ref false
async {
while not(!completed) do
let! client = t.AsyncAcceptTcpClient()
if client <> null then
Blah(client)
else
completed := true
}

(那是在我的浏览器中输入代码,希望它能编译)。这很好,因为您当然不能在 C# 代码中使用循环(它必须跨越具有开始/结束回调的多个方法)。

关于f# - 如何在 F# 中执行链式回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1468145/

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