2010-03-15 4 views
5

Basierend auf meinem Lesen und Testen, mit asynchronen Sockets, kann der Socket selbst mit State-Objekt (IAsyncResult Ergebnis) übergeben werden, auch wenn den Socket als ein privates Feld speichern, würde es von den Callback-Methoden erfasst werden .C# Asynchronous Sockets Fragen

Ich frage mich, wie das IAysnResult zwischen den BeginXXX und ReceiveXXX gekepelt wird? Es sieht für mich so aus, dass nach dem BeginXXX-Aufruf und dem Ende der Methode das Zustandsobjekt von GC entsorgt würde, wenn es keinen Verweis darauf gibt.

Bei privaten Feld, wie das private Feld zwischen Threads geteilt wird? (Soweit ich weiß, wird ein Callback mit einem Thread aus dem Standard-Thread-Pool ausgeführt, der als neuer Thread betrachtet werden würde.)

Vielen Dank, ich hoffe, die Fragen selbst sind klar.

Antwort

0

Der GC entsorgt keine Objekte, er gibt Speicher frei, der von Objekten ohne Referenzen verwendet wird. Client-Code sollte Objekte entsorgen, GC tut das nie.

IAysnResult hat immer noch eine Referenz in einem Delegaten in einem Thread-Pool ausgeführt, so dass es nicht von GC Unitl gesammelt werden eine Callback-Methode beendet.

Private Mitglieder sind für den ausführenden Thread immer sichtbar, sodass Ihr privates Socket-Feld für alle Threads zugänglich ist, die Methoden der enthaltenden Klasse ausführen.