Hi maggie,
wenn du in SetText und SetLabel Invoke() verwendest, dann sehe ich so auch keinen Fehler.
Auch deine Leseschleife ist in Ordnung (locking und Thread.Sleep).
Evtl. kannst du ja mal einzelne Codeteile auskommentieren (als erstes mal den ganzen Lesethread) und schauen, ob dann das Fenster immer noch hängt...
Gerade wo ich diesen Text schreibe, fällt mir noch auf, daß du auch SetText innerhalb des locks verwendest. Da aber im GUI-Thread beim Button-Click writePort mit dem locking aufgerufen wird, könnte dies der Grund für den Hänger sein.
Also besser so:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| lock (sendBuffer) { ... }
SetText(...); |
Du brauchst ja nur schreibende Zugriff zu locken.
Auch bei writePort könntest du daher
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| if (sendBuffer.Count < 32) { lock (sendBuffer) { sendBuffer.Add(data); } } |
verwenden, da ein locking immer relativ teuer ist.
Analog dann auch bei SendPort nur das locking um 'sendBuffer.RemoveRange(0, anzahl);' herum.
So ich hoffe, das hilft dir jetzt weiter.