J'écris une application avec une interface de communication en couches. Cela a été fait pour extraire les communications de la partie interface utilisateur de l'application et également pour la rendre plus évolutive/maintenable.
Par exemple:Gestion des conditions de course en C#
Tenir compte de chaque boîte dans la figure ci-dessus comme une catégorie distincte.
L'interface de communication générique remplit les variables de chaîne décrivant les données traitées et les communications "health", qui sont à leur tour copiées vers l'application via une série d'appels de fonction publique. Par exemple, l'application ferait un appel à l'App-Sub-System:
class Application
{
private void SomeUpdateFunction()
{
this.textBox1.AppendText(this.AppSubSystem.GetText());
}
}
class AppSubSystem
{
public string GetText()
{
return this.GenericCommsInterface.GetText();
}
}
class GenericCommsInterface
{
public string GetText()
{
string sRetVal = this.sText; // sText is populated by other functions in the class.
this.sText = null; // Suspected race condition is here.
return sRetVal;
}
}
sText
est peuplée de manière asynchrone par d'autres fonctions dans la classe.
Je crois qu'une condition de concurrence se produit entre string sRetVal = this.sText;
et la ligne suivante this.sText = null;
.
Quelqu'un peut-il suggérer un moyen d'éviter ou d'éviter cette condition de concurrence? Serait l'aide StringBuilder
aide, ou est-ce qu'il y a une autre façon que je devrais faire cela?
Très mauvais à 'verrouiller' sur un objet qui n'est pas garanti stable à travers l'accès au thread - les verrous sont 'consultatifs' en ce que tout le monde doit les utiliser/les honorer. Ceci est particulièrement mauvais car vous continuez à changer l'objet lock (en définissant la variable qui le contient sur null). –
Bon point.Une autre raison d'utiliser un StringBuilder. – cHao
Merci pour les conseils! J'ai remplacé 'private string sText' par' private StringBuilder cText' et j'ai implémenté les verrous. Cela fonctionne très bien! La condition de course a disparu. Gloire! –