在C#中使用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角度来看,上述代码是否足以处理所有传入的请求?即通过等待一个请求,一旦它被接受就开始等待另一个请求。这样做是否会导致某些请求失败?
Handle(socket)
什么时候运行? - leppiepublic async void AwaitSocket() { while (true) { var socket = await this.AcceptSocketAsync(); Handle(socket); } }
,它有什么优势呢? - user743382await
可能会同步完成,在这种情况下,顺序会混乱。 - user743382await
并不总是直接返回。它可能会直接返回,或者如果结果已经可用而无需等待,则可能直接处理结果。 - user743382Handle()
实例。 - svick