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?

questionAnswers(1)

yourAnswerToTheQuestion