【发布时间】:2010-11-30 21:19:07
【问题描述】:
在 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,并且在技术上将其标记为递归是不正确的,因为它不是递归方法?
【问题讨论】:
-
只是想说明C#代码可以StackOverflow;为避免这种情况,您需要检查 ar.CompletedSynchronously 并且...呃...在 C# 中执行此操作是一场噩梦。很高兴你有 F#。 :)
-
但为了完整起见,请参阅blogs.msdn.com/mjm/archive/2005/05/04/414793.aspx 以获得完全正确的 C# 代码。
标签: f# asynchronous tcplistener