dass alles in einem Thread läuft stimmt aber nicht ganz, der Serial Port erzeugt sein Event asynchron

textBox1.Invoke(new StringDelegate(DisplayString), port.ReadExisting());

nja du hast es ja auch geschickt verpackt, aber erklären sollte man es zwecks verständnis finde ich ^^

Widgets sind halt generell gesperrt gegen Thread-Fremde zugriffe ... und der Serial Port hat seinen eigenen Thread, die "DataReceived"-Methode wird von dem Thread aufgerufen

durch die Invoke-Methode (die man auch etwas ausführlicher schreiben kann und mit einer if-abfrage für die Prüfung der Notwendigkeit versehen kann) wird der Aufruf indirekt an den Thread des Objektes übergeben und in diesem Kontext ausgeführt, was legal ist!