Ich schreibe eine Anwendung mit einer mehrschichtigen Kommunikationsschnittstelle.
Dies wurde gemacht, um die Kommunikation von dem Benutzerschnittstellenteil der Anwendung zu abstrahieren und sie auch skalierbarer / wartbarer zu machen.
Zum Beispiel:
Betrachten Sie jede Box in der obigen Abbildung als separate Klasse.
Die Generic Comms Interface füllt String-Variablen, die die abgewickelten Daten und den "Gesundheit" der Kommunikation beschreiben, die wiederum durch eine Reihe von öffentlichen Funktionsaufrufen in die Anwendung kopiert werden. Die Anwendung ruft beispielsweise das App-Subsystem auf:
sText
wird asynchron von anderen Funktionen in der Klasse gefüllt.
Ich glaube, eine Race Condition passiert zwischen string sRetVal = this.sText;
und der folgenden Zeile this.sText = null;
.
Kann jemand einen Weg vorschlagen, diesen Zustand zu vermeiden oder zu verhindern? Würde StringBuilder
help verwenden, oder gibt es eine andere Möglichkeit, dass ich das machen sollte?
Sie sollten wahrscheinlich jederzeit eine Sperre erhalten, wenn Sie this.sText
- in den Funktionen, die es aktualisieren, sowie Ihre GetText
-Funktion berühren möchten. Dies würde sicherstellen, dass immer nur ein Thread mit ihm rumhängt, da (vorausgesetzt, Ihr Thread hat die Sperre) andere Threads sitzen und warten, bis der aktuelle Thread fertig ist.
Ich empfehle Ihnen, einen StringBuilder zu verwenden, teilweise um das Sperren zu vereinfachen, da das Sperren einer Zeichenfolge, die gerade interniert wurde, oder eines mitten in der gesperrten Operation (und damit aus der Sicht eines Außenseiters entsperrt) erfolgen kann wirklich schlechtes mojo. So etwas würde helfen:
%Vor% Alternativ könntest du this
sperren, aber das ist hässlich - deine Sperren sollten so privat wie möglich drin sein, um seltsame Nebenwirkungen zu vermeiden (wie wenn ein anderes Objekt versucht, eine Sperre dafür zu erhalten) Objekt - dies konnte nicht ausgeführt werden, während sbText
geändert wurde.
Dieser Code wird sicherlich nicht in einer Umgebung mit Threads funktionieren, da Sie sText nicht schützen. Sie müssen jeden sperren, der darauf zugreift.
Tags und Links c# race-condition