In C# mit Asynchron-CtP oder vs.net 2011 Beta können wir rekursive Code wie folgt schreiben:Ist asynchrone Rekursion in C# sicher (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
}
In diesem speziellen Probe, die Code-Asynchron wartet auf eine TCP-Socket und sobald es angenommen wurde, es wird rekursiv und asynchron auf einen anderen warten.
Dies scheint gut zu funktionieren, da der Abschnitt warten den Code zurück zum Aufrufer und damit keinen Stapelüberlauf verursachen wird.
So zwei Fragen hier:
, wenn wir die Tatsache, dass wir es zu tun haben mit Steckdosen in dieser Probe zu ignorieren. Ist es in Ordnung, die Stapelfreie Rekursion auf diese Weise durchzuführen? oder gibt es Nachteile Ich vermisse?
aus einer IO-Perspektive würde der obige Code genug sein, um alle eingehenden Anfragen zu behandeln? Ich meine, indem ich nur auf eins warte, und sobald es akzeptiert wird, fange an, auf einen anderen zu warten. Scheitern einige Anfragen irgendwie?
Also wann läuft 'Handle (Socket)' jemals? – leppie
Ich sehe nichts falsches an sich, aber was fügt es dem IMO einfacher hinzu? Public async void AwaitSocket() {while (wahr) {var socket = away this.AcceptSocketAsync(); Griff (Steckdose); }} '? – hvd
@leppie Nach 'AwaitSocket();' kehrt zurück. Und ja, es kommt zurück. – hvd