Tôi có một máy chủ socket mà cần phải chạy trên một vòng lặp chấp nhận khách hàng, vì vậy tôi phát hiện ra rằng trong chương trình funcional, một vòng lặp đệ quy được sử dụng:F # vòng lặp liên tục trong F #
let awaitConnections (wsl:WebSocketListener) =
let rec loop()=
async {
let! ws = Async.AwaitTask (wsl.AcceptWebSocketAsync(cancellation.Token))
printfn "Connection from %s" (ws.RemoteEndpoint.Address.ToString())
Async.Start <| awaitMessages ws
do! loop()}
loop()
Và mã này được gọi bằng cách thực hiện:
Async.Start <| awaitConnections listener
Xem xét ứng dụng chạy liên tục, tôi có nên sử dụng phương pháp lặp lại thay thế không? Phương pháp rec
có tạo ngăn xếp thực thi lồng nhau không?
Ngoài ra, tôi muốn làm điều gì đó sau khi vòng lặp kết thúc, như:
let awaitConnections (wsl:WebSocketListener) =
let rec loop()=
async {
let! ws = Async.AwaitTask (wsl.AcceptWebSocketAsync(cancellation.Token))
printfn "Connection from %s" (ws.RemoteEndpoint.Address.ToString())
Async.Start <| awaitMessages ws
do! loop()}
loop()
printf "The loop ended" // <-- this line
Nhưng sau đó nó không thể biên dịch bởi vì các loại awaitConnections
trở lại. Làm thế nào tôi có thể làm điều đó? Tôi làm đúng chứ hả?
Cảm ơn! nơi tôi có thể tìm thêm thông tin về 'return!' so với 'do!'? – vtortola
Đó là một câu hỏi được tải, nhưng tôi sẽ cho nó một shot. Các biểu thức tính toán như 'async' là đường cú pháp cho một chuỗi các cuộc gọi hàm và phần tử trả về là kết quả của các hàm. 'do!' định nghĩa một biểu thức trả về 'đơn vị', cái mà (trong trường hợp này) về cơ bản tạo ra một đối tượng' Async <'a> 'mới không làm gì ngoài việc đi vào một cuộc gọi đệ quy và' return! 'tránh điều này. Phải thừa nhận rằng, điều này có một số suy nghĩ về cách các đối tượng 'Async' hoạt động phía sau hậu trường để làm cho mọi thứ xảy ra. –
Cảm ơn, rất hữu ích. – vtortola