Hallo,
ich habe einen Thread, der Daten von der seriellen Schnittstelle
einliest.
Diese sollen auf der Console ausgegeben werden.
Die Ausgabe soll im eigenen Thread stattfinden, um den Einlsese-Thread
nicht zu blockieren.
Dieser Ansatz funktioniert nicht ganz so toll:
1 | while (_continue)
|
2 | {
|
3 | try
|
4 | {
|
5 | if (_serialPort.BytesToRead > 0) {
|
6 | var ret = _serialPort.Read(arr,0,_serialPort.BytesToRead);
|
7 | if (ret > 0) {
|
8 | this.BeginInvoke((MethodInvoker) delegate {
|
9 | for (int i=0;i<ret;i++) {
|
10 | Console.WriteLine("{0,5}:{1,2:X}",cnt,arr[i]);
|
11 | cnt++;
|
12 | }
|
13 | });
|
14 | }
|
15 | }
|
16 | }
|
17 | catch (TimeoutException) { }
|
18 | }
|
Das Problem ist, wenn die Ausgabe-Routine verzögert ist, dann gibt der
WriteLine nicht die Werte (arr[]) aus, mit der das delegate aufgerufen
wurde, sondern die bereits aktualisierten.
D.h. werden die Werte 1,2,3,4,5 empfangen, so gibt er z.B. 1,2,4,4,5
aus.
Ich hatte schon arr[] zwischengespeichert, damit die ursprünglichen
Werte für das delegate erhalten blieben, aber das funktioniert auch
nicht.
Was tun?