A recursão assíncrona é segura em c # (async ctp / .net 4.5)?
Em c # com async ctp ou o vs.net 2011 beta podemos escrever código recursivo como este:
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
}
Neste exemplo específico, o código assíncrono espera por um soquete tcp e, uma vez aceito, ele irá reciclar e assíncrono esperar por outro.
Isso parece funcionar bem, já que a seção await fará com que o código retorne ao chamador e, portanto, não cause um estouro de pilha.
Então duas perguntas aqui:
se ignorarmos o fato de estarmos lidando com soquetes nessa amostra. É aceitável fazer recursividade de pilha livre dessa maneira? ou há desvantagens que estão faltando?
a partir de uma perspectiva de IO, o código acima seria suficiente para lidar com todas as solicitações recebidas? Quero dizer, apenas esperando por um, e uma vez aceito, comece a esperar por outro. Algumas solicitações falharão por causa disso de alguma forma?