Hallo und
Vorweg: Ich habe den seriellen Anschluss bisher nicht in C# benutzt, dafür schon oft in Delphi. Ich nehme nicht an, dass sich das besonders unterscheidet.
Dabei benutze ich entweder einen Thread, der auf Daten oder einen Abbruch wartet, oder ich lese im Event, dass Daten empfangen wurden, alle vorhandenen Daten aus und füge sie zu den bereits empfangenen Daten hinzu.
Für den ersten Fall gibt es in C# WaitHandle.WaitAny als Äquivalent zur API-Funktion WaitForMultipleObjects unter Windows. Damit kannst du einerseits auf den seriellen Anschluss und andererseits auf ein Abbruchevent warten, so dass du den Wartevorgang sauber beenden kannst.
Damit habe ich aber nicht so gute Erfahrungen gemacht. Theoretisch sollte es so gehen, praktisch kam manchmal nie ein Event vom seriellen Anschluss.
In beiden Fällen ist das Vorgehen danach identisch:
Wenn die Transmission komplett ist (ich also z.B. das Endzeichen gefunden habe oder die gewünschte Länge erreicht ist oder ...), löse ich ein internes Event aus, dem ich diese Daten mitgebe.
Wenn ich mit der Windows API arbeite, gibt es auch weitere Events, aber die scheint es unter C# nicht zu geben. Insofern ist die Analyse der empfangenen Daten und ein eigenes Event bei Erfolg denke ich die beste Variante.