【发布时间】:2012-06-04 13:58:57
【问题描述】:
在带有异步 ctp 的 C# 或 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
}
在这个特定的示例中,代码 async 等待一个 tcp 套接字,一旦它被接受,它将递归并异步等待另一个。
这似乎工作正常,因为等待部分会使代码返回给调用者,因此不会导致堆栈溢出。
这里有两个问题:
如果我们忽略此示例中处理套接字的事实。 以这种方式进行无堆栈递归可以吗?还是我缺少一些缺点?
从 IO 的角度来看,上面的代码是否足以处理所有传入的请求? 我的意思是只等待一个,一旦被接受就开始等待另一个。 某些请求会因此而失败吗?
【问题讨论】:
-
那么
Handle(socket)什么时候运行? -
我看不出它本身有什么问题,但它给 IMO 增加了什么更直接的
public async void AwaitSocket() { while (true) { var socket = await this.AcceptSocketAsync(); Handle(socket); } }? -
@hvd:这玩意简直伤脑筋! ;p
-
@RogerAlsing 你确定吗?
await可能会同步完成,在这种情况下,顺序会混乱。 -
@RogerAlsing 不,
await不 总是直接返回,正如我在之前的评论中提到的那样。它可能直接返回,或者如果结果已经可用而无需等待,它可能直接处理结果。