В С# я использую асинхронные версии 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 не определен, а его рекурсивная техническая маркировка неверна, поскольку это не рекурсивный метод?