Estoy escribiendo una aplicación con una interfaz de comunicaciones en capas.
Esto se hizo para abstraer las comunicaciones de la parte de la interfaz de usuario de la aplicación y también para hacerla más escalable/mantenible.
Por ejemplo:Manejo de condiciones de carrera en C#
considerar cada cuadro en la figura anterior como una clase separada.
La interfaz de comunicación genérica completa las variables de cadena que describen los datos transaccionados y las comunicaciones "salud", que a su vez se copian a la aplicación a través de una serie de llamadas a funciones públicas. Por ejemplo, la aplicación podría hacer una llamada a la 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
se rellena de forma asíncrona por otras funciones en la clase.
Creo que una condición de carrera está sucediendo entre string sRetVal = this.sText;
y la siguiente línea this.sText = null;
.
¿Alguien puede sugerir una forma de evitar o prevenir esta condición de carrera? ¿Ayudaría usar StringBuilder
ayuda, o hay otra forma en que debería estar haciendo esto?
Muy malo para 'bloquear' en un objeto que no está garantizado para ser estable a través del acceso al hilo - los bloqueos son 'asesores' ya que todos deben usarlos/respetarlos. Esto es particularmente malo porque sigues cambiando el objeto de bloqueo (estableciendo la variable que lo contiene en nulo). –
Buen punto.Otra razón para usar un StringBuilder. – cHao
¡Gracias por los consejos! Reemplacé 'private string sText' con' private StringBuilder cText' e implementé los bloqueos. ¡Funciona genial! La condición de carrera ha desaparecido. ¡Prestigio! –