В С# с async ctp или бета-версией vs .net 2011 мы можем написать рекурсивный код следующим образом:
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-сокета, и как только он будет принят, он перезаписывает и async ждет другого.
Кажется, что это нормально, поскольку раздел ожидания приведет к возврату кода вызывающему и, следовательно, не приведет к переполнению стека.
Итак, два вопроса:
-
если мы игнорируем тот факт, что мы имеем дело с сокетами в этом примере. Это нормально, чтобы сделать стековую бесплатную рекурсию таким образом? или есть недостатки, которые я потерял?
-
с точки зрения ввода-вывода, будет ли вышеуказанный код достаточным для обработки всех входящих запросов? Я имею в виду, просто ожидая его, и как только он будет принят, начните ждать другого. Из-за этого некоторые запросы потерпят неудачу?