En C# con CTP asíncrono o de la beta vs.net 2011 podemos escribir código recursivo de esta manera:¿La recursión asíncrona es segura en C# (async ctp/.net 4.5)?
public async void AwaitSocket()
{
var socket = await this.AcceptSocketAsync(); //await socket and >>return<< to caller
AwaitSocket(); //recurse, note that the stack will never be deeper than 1 step since await returns..
Handle(socket); // this will get called since "await" returns
}
En esta muestra específica, que espera el código asincrónicos para un socket TCP y una vez que ha sido aceptado, se recurrirá y sincronizará espera de otro.
Esto parece funcionar bien, ya que la sección de espera hará que el código regrese a la persona que llama y, por lo tanto, no cause un desbordamiento de la pila.
Así que dos preguntas aquí:
si ignoramos el hecho de que estamos tratando con tomas en esta muestra. ¿Está bien hacer la recursión sin pila de esta manera? o hay inconvenientes que me falta?
desde una perspectiva IO, ¿el código anterior sería suficiente para manejar todas las solicitudes entrantes? Quiero decir con solo esperar una, y una vez que sea aceptada, empiece a esperar otra. ¿Algunas solicitudes fallarán debido a esto de alguna manera?
Así que cuando no 'manija (socket)' vez se ha quedado? – leppie
No veo nada incorrecto en sí mismo, pero ¿qué le agrega al OMI más directo? Public async void AwaitSocket() {while (true) {var socket = await this.AcceptSocketAsync(); Manija (zócalo); }} '? – hvd
@leppie Después de 'AwaitSocket();' regresa. Y sí, regresa. – hvd