Erst einmal der Standardsatz: .Net programmieren wollen, aber C# nicht lesen können - no-go. Da Java-artige Syntax nicht gerade zu den schwerst verständlichen gehört (der Delphi-Programmierer wird Pascal natürlich trotzdem vorziehen
), würde ich auf jeden Fall einmal einen Nachmittag Zeit nehmen, um die Sprache zu verinnerlichen.
BTT:
Als Callback musst du eine Methode mit einem IAsyncResult-Parameter übergeben, die dann asynchron aufgerufen wird und in der du EndRead aufrufst, um die Daten zu erhalten und zu bearbeiten. EndRead blockiert solange, bis die Daten verfügbar sind, was aber kein Problem darstellt, da wir uns ja gerade in einem parallelen Thread befinden. Nun muss EndRead nur noch irgendwie mitgeteilt werden, welche Daten es denn auslesen soll, was eben mit dem IAsyncResult-Parameter geschieht. BeginRead tritt also das Ganze los und gibt dir den Parameter, mit dem du dann passend EndRead aufrufen kannst.
Zu state wirst du nicht mehr Informationen finden, denn das Stichwort wurde schon genannt: benutzerdefiniertes Objekt. Das Framework interessiert es überhaupt nicht, was in state steckt, bzw. ob er einfach nil ist. Hast du jedenfalls einen vernünftigen Wert übergeben und willst ihn dann im asynchronen Callback auswerten, bekommst du ihn per asyncResult.AsyncState. Unter 1.1 wirst du meistens den Stream übergeben, da du ihn ja für den EndRead-Aufruf benötigst, mit 2.0 und seinen anonymen Methoden ist state quasi ausgestorben.
Noch einmal zusammengefasst:
Code:
Hauptthread:
- hole Stream s
- rufe s.BeginRead auf (non blocking), state = s
Nebenthread (Methode mit Parameter asyncResult: IAsyncResult):
- hole Stream s aus asyncResult.AsyncState
- rufe s.EndRead auf (blocking)
- bearbeite Daten