2011-08-01 13 views
5

¿Hay alguna diferencia entre escribir algo como esto:F # asíncrono - diferencia entre una estructura de dos

MailboxProcessor.Start(fun inbox -> async { 
    let rec loop bugs = 
     let! msg = inbox.Receive() 
     let res = //something 
     loop res 
    loop []}) 

y la escritura de esta manera:

MailboxProcessor.Start(fun inbox -> 
    let rec loop bugs = async { 
     let! msg = inbox.Receive() 
     let res = //something 
     do! loop res } 
    loop []) 

Gracias!

Respuesta

7

El primer ejemplo no es válido Código F #, porque let! solo se puede usar inmediatamente dentro de la expresión de cálculo. En su ejemplo, lo está usando en una función normal: su cuerpo no es una expresión de cálculo, por lo que let! no está permitido en esa posición.

Para que sea válido, lo que se necesita para envolver el cuerpo de la función loop dentro async:

MailboxProcessor.Start(fun inbox -> async { 
    let rec loop bugs = async { 
     let! msg = inbox.Receive() 
     let res = //something 
     return! loop res } 
    return! loop []}) 

Puede mantener el bloque exterior async { .. } en el fragmento, así - a continuación, sólo tiene que utilizar return! para llamar a su función loop en lugar de simplemente devolverla (pero aparte de eso no hay una diferencia significativa ahora).

Tenga en cuenta que utilicé return! en lugar de do! - esto realmente hace una diferencia, porque return! representa una llamada de cola, lo que significa que el resto del cuerpo actual se puede descartar. Si usa do!, la función asíncrona asigna algo así como un marco de pila en el montón, por lo que al usar do! en una función de bucle recursivo se pierde la memoria.

+2

No puedo evitar preguntarme por qué no vieron si funciona primero. – ChaosPandion

+1

Y aquí me preguntaba por qué cuando llegué a casa todas mis aplicaciones se habían bloqueado con mi sistema diciendo que no había memoria virtual. Gracias Tomas! –

+0

@ ChaosPandion Muy buen punto, estaba jugando con un código que no compilaba por otra razón y simplemente asumí que lo que estaba viendo funcionaría. No dude en votar la pregunta, pero la respuesta de Tomás fue bastante útil de todos modos. –

Cuestiones relacionadas