Kann man port.ReadLine(); schneller verarbeiten?(C#)?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Der SerialPort ist leider ein großer Haufen Schrott :D
Durfte ich auch schon auf die harte Tour herausfinden.
Du kannst ja schauen, ob Du eine bessere Implementierung kennst - ich kenne keine, habe aber auch nicht gesucht.

Bei dir dauert es solange, weil er solange liest und wartet, bis eine neue Zeile erkannt wurde. Solange die neue Zeile nicht angekommen ist, ist die Nachricht unvollständig und die Methode wartet synchron weiter.

Mein Versuch war asynchrones Schreiben und Lesen, was mit der Implementierung nicht wirklich möglich ist, meine Lösung funktioniert aber auch synchron.
Mein erster Versuch war mit dem DataReceived-Event, allerdings gibt's damit auch ein paar Probleme, weshalb ich das später wieder verworfen habe. Stattdessen arbeitet es jetzt in einer while-Schleife mit der Read-Methode, die liest so viele Bytes, wie im Puffer liegen. Aber das funktioniert natürlich nur, wenn man das Ende der Nachricht irgendwie erkennen kann, sonst liest er einfach ewig.

Du liest also solange mit der Read-Methode und schreibst alles in einen MemoryStream, bis Du das Ende der Nachricht erkannt hast. Aus dem MemoryStream kannst Du dann mit einem StreamReader deinen Text lesen.
Oder - wenn Du nur die Bytes brauchst - Du sparst dir MemoryStream und StreamReader und verarbeitest die Bytes einfach direkt.

Das löst natürlich nicht das Problem, dass die UI hängt, solange er liest, das ist aber kein Problem vom SerialPort, sondern dass synchrones Lesen im UI-Thread läuft und der solange nichts anderes tun kann. Das kannst Du lösen, indem Du auch asynchron arbeitest (ausführliche Einarbeitung zwingend notwendig!) oder in einem eigenen Thread synchron liest.

Bei mir läuft die asynchrone Implementierung mit einer Art Command-Pattern und einem einem ActionBlock<T>. Jeder "Command" überwacht einen CancellationToken (zum Abbrechen) und liefert mit Hilfe einer TaskCompletionSource einen Task, damit ich asynchron darauf warten kann.

Woher ich das weiß:Berufserfahrung

Geht, hab ich auch schon gemacht. Aber recht aufwändig: Man setzt einen Interrupthandler auf, der im Hintergrund die Zeichen in einen Buffer einliest. Die holt man dann ab, wenn man Zeit hat. Es gibt auch Libraries, die das übernehmen, z.Bsp. von Kithara, aber die kosten dann schon was, und erfordern auch eine gewisse Einarbeitungszeit.

Die andere Idee die hier geschrieben wurde geht auch, dann musst du ich aber mit der Kommunikation zwischen den Task auseinandersetzen.

also schneller wüsst ich spontan nicht wie , kannst aber die ganze sache in nem thread/task machen, somit freezt dein programm nicht mehr und das ganze läuft im background