Обработка условий гонки в C#

Я пишу приложение с многоуровневым интерфейсом связи.
Это было сделано, чтобы абстрагировать сообщения от части пользовательского интерфейса приложения, а также сделать его более масштабируемым/обслуживаемым.
Например:

alt text

рассмотреть каждую коробку на рисунке выше как отдельный класс.
Универсальный интерфейс Comms заполняет строковые переменные, описывающие транзакционные данные и "работоспособность" comms, которые, в свою очередь, копируются к приложению через ряд публичных функций. Например, приложение сделает вызов 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 асинхронно заполняется другими функциями в классе.
Я верю, что состояние гонки происходит между string sRetVal = this.sText; и следующая строка this.sText = null;.
Может ли кто-нибудь предложить способ избежать или предотвратить это состояние гонки? Будет использовать StringBuilder помогите, или есть другой способ, которым я должен это делать?

3 ответов


вы, вероятно, должны приобретать замок в любое время, когда вы хотите коснуться this.sText -- в функциях, которые обновляют его, а также ваш


этот код, безусловно, не будет работать в потоковой среде, поскольку вы не защищаете sText. Вы должны запереть всех, кто имеет к нему доступ.


public string GetText()
{
   lock( someObject )
   {
      string sRetVal = this.sText; // sText is populated by other functions in the class.
      this.sText = null; // Suspected race condition is here.
      return sRetVal;
   }
}    

в наборе

lock( someObject )
{
    //...
    this.sText = value;
}