在使用 async ctp 或 vs.net 2011 beta 的 C# 中,我们可以编写如下递归代码:
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 套接字,一旦它被接受,它将递归并异步等待另一个套接字。
这似乎工作正常,因为等待部分将使代码返回到调用者,因此不会导致堆栈溢出。
所以这里有两个问题:
如果我们忽略这个示例中我们正在处理套接字的事实。
这样进行无堆栈递归可以吗?或者我缺少什么缺点吗?
从 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...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)