异步递归在C#(async ctp / .net 4.5)中是否安全?

在C#with async ctp或vs.net 2011 beta中,我们可以编写这样的递归代码:

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 } 

在此特定示例中,代码异步等待tcp套接字,一旦被接受,它将递归并且异步等待另一个。

这似乎工作正常,因为await部分将使代码返回到调用者,因此,不会导致堆栈溢出。

这里有两个问题:

  1. 如果我们忽略了我们在这个样本中处理套接字的事实。 以这种方式进行堆栈自由递归是否可以? 还是有缺点我不见了?

  2. 从IO的角度来看,上面的代码是否足以处理所有传入的请求? 我的意思是只是等待一个,一旦它被接受开始等待另一个。 某些请求会因某种原因而失败吗?

从上面的讨论中,我猜这样的事情将是最好的方法。 请提供反馈

 public async void StartAcceptingSockets() { await Task.Yield(); // return to caller so caller can start up other processes/agents // TaskEx.Yield in async ctp , Task.Yield in .net 4.5 beta while(true) { var socket = await this.AcceptSocketAsync(); HandleAsync(socket); //make handle call await Task.Yield to ensure the next socket is accepted as fast //as possible and dont wait for the first socket to be completely handled } } private async void HandleAsync(Socket socket) { await Task.Yield(); // return to caller ... consume the socket here... }