Kontinuierlich Lesen von einem stream???
Habe ich ein Stream-Objekt wird gelegentlich einige Daten über Sie, sondern in unvorhersehbaren Abständen. Nachrichten, die angezeigt auf dem Stream sind gut definiert, und deklarieren Sie die Größe Ihrer Nutzlast im Voraus (die Größe ist ein 16-bit-integer enthalten in den ersten beiden bytes jeder Nachricht).
Ich würde gerne eine StreamWatcher Klasse, die erkennt, wenn der Stream hat einige Daten über Sie. Sobald es funktioniert, ich möchte, dass ein Ereignis ausgelöst werden, so dass eine abonnierte StreamProcessor-Instanz Bearbeiten können Sie die neue Nachricht.
Kann das mit C# - Veranstaltungen ohne Verwendung von Threads direkt? Es scheint, wie es einfach sein sollte, aber ich kann Sie nicht so Recht, meinen Kopf um den richtigen Weg zu entwerfen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie sagen, nicht verwenden, threads direkt, ich nehme an, Sie wollen immer noch, Sie zu benutzen indirekt über asynchrone Aufrufe, sonst wäre dies nicht sehr sinnvoll.
Alles, was Sie tun müssen, ist, wickeln Sie die async-Methoden der
Stream
und speichern das Ergebnis in einem Puffer. Zunächst definieren wir die event-Teil der spec:Nun, Lesen Sie ein 16-bit-integer aus dem stream asynchron und berichten, wenn es fertig ist:
Ich denke, das ist über es. Dies setzt Voraus, dass-je nachdem welche Klasse ist der Umgang mit der Nachricht hat auch Zugang zu den
Stream
ist und bereit ist, es zu Lesen, synchron oder asynchron, basierend auf die Nachricht, die Größe der Veranstaltung. Wenn Sie möchten, dass der watcher-Klasse tatsächlich Lesen Sie die gesamte Nachricht, dann haben Sie etwas mehr code zu tun.(bytesRead != 2)
Sie sollten nicht eine Ausnahme werfen, aber BeginRead erst wieder zwei bytes, die gelesen wurden.OnMessageAvailable
angehoben werden, bevorWatchNext
imReadCallback
?Ja, das kann getan werden. Verwenden Sie den non-blocking Stream.BeginRead - Methode mit einem Generalasyncdelegate. Der Rückruf wird asynchron aufgerufen, sobald Daten verfügbar. In der callback, call Stream.EndRead, um die Daten abzurufen, und rufen Sie Stream.BeginRead wieder, um das nächste Segment der Daten. Puffer für eingehende Daten in ein byte-array, das groß genug ist, halten Sie die Nachricht. Sobald das byte-array voll ist (mehrere callback-Aufrufe benötigt werden könnten), das Ereignis auslösen. Lesen Sie dann die nächste Nachricht, die Größe, erstellen Sie einen neuen Puffer, wiederholen, fertig.
Thread
oder threading! =) Lass ihn verstehen, und wählen Sie.Dem normalen Ansatz ist die Verwendung der .NETTO-asynchrone Programmierung-Muster ausgesetzt
Stream
. Im wesentlichen, Sie beginnen, Lesen asynchron aufrufenStream.BeginRead
übergibt einebyte[]
Puffer und eine callback-Methode wird aufgerufen, wenn die Daten aus dem stream gelesen. In der callback-Methode, rufen SieStream.EndRead
auf, übergeben Sie dieIAsncResult
argument, das gegeben wurde, um Ihren Rückruf. Der Rückgabewert vonEndRead
sagt Ihnen, wie viele bytes in den Puffer eingelesen.Sobald Sie habe die ersten paar bytes auf diese Weise können Sie dann warten, bis der rest der Nachricht (wenn Sie nicht genug bekommen Daten das erste mal), indem Sie
BeginRead
wieder. Sobald Sie haben die gesamte Meldung können Sie das Ereignis auslösen.Nicht mit Strom.BeginRead() das gleiche wie mit dem synchron-Stream.Read () - Methode in einem separaten thread?