W języku C# z CTP asynchronicznym lub vs.net 2011 beta możemy napisać rekurencyjną kodu:Czy rekurencja asynchroniczna jest bezpieczna w języku C# (async ctp/.net 4.5)?
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
}
W tej konkretnej próbki, czeka na kod async gniazda TCP i raz został on zaakceptowany, będzie się powtarzać i asynchronicznie czekać na kolejną.
Wygląda na to, że działa dobrze, ponieważ oczekująca sekcja sprawi, że kod wróci do wywołującego, a zatem nie spowoduje przepełnienia stosu.
Więc dwa pytania tutaj:
jeśli pominiemy fakt, mamy do czynienia z gniazd w tej próbce. Czy można w ten sposób wykonywać rekurencję bez użycia sterty? czy są jakieś wady?
z perspektywy IO, czy powyższy kod byłby wystarczający do obsłużenia wszystkich przychodzących żądań? Mam na myśli tylko czekanie na jeden, a gdy już zostanie przyjęty, zaczekaj na kolejną. Czy niektóre żądania zawiodą z tego powodu?
Kiedy więc "Handle (socket)" kiedykolwiek działa? – leppie
Nie widzę w tym nic złego per se, ale co to znaczy dodać do IMO bardziej prostego 'public async void AwaitSocket() {while (true) {var socket = czekaj na to.AcceptSocketAsync(); Uchwyt (gniazdo); }} '? – hvd
@leppie Po 'AwaitSocket();' zwraca. I tak, wraca. – hvd