Как называется эта модель? Мягкий замок? - PullRequest
3 голосов
/ 31 августа 2011

Вот немного кода, который мне иногда приходится писать, в основном в сочетании с пользовательским интерфейсом и всегда с событиями, которые могут случайно запутаться в бесконечных циклах.

  public class MyClass
  {
    public event EventHandler MyEvent;
    private bool IsHandlingEvent = false;

    public MyClass()
    {
      MyEvent += new EventHandler(MyClass_MyEvent);
    }

    void MyClass_MyEvent(object sender, EventArgs e)
    {
      if (IsHandlingEvent) { return; }

      IsHandlingEvent = true;
      {
        // Code goes here that handles the event, possibly invoking 'MyEvent' again.
        // IsHandlingEvent flag is used to avoid redundant processing.  What is this
        // technique, or pattern called.
        // ...
      }
      IsHandlingEvent = false;
    }
  }

Как видите, использование флага IsHandlingEvent используется для предотвращения избыточных или возможных бесконечных вызовов событий. Хотя я не всегда делаю подобные вещи (из-за очевидных опасностей), иногда это полезное решение, но я не знаю, как это назвать. Из-за отсутствия лучшего термина, я использовал «мягкую блокировку». Какое настоящее имя?

EDIT:
Да, я знаю, что это не потокобезопасно и т. Д. Это вопрос имени, а не вопрос дизайна. Но так как это стоит обсудить ...
Улучшение кода: лучшие альтернативы этому шаблону?

Ответы [ 2 ]

3 голосов
/ 31 августа 2011

О дизайне уже много сказано (не поточно-ориентированный и т. Д.).

Похоже, вы спрашиваете имя ... не знаю, широко ли оно встречается, но я слышал, что его несколько раз называли часовым стражем.

1 голос
/ 31 августа 2011

Я думаю, что это в некоторой степени связано с семафором , т. Е. С поиском доступа к чему-либо с помощью логической переменной.

Редактировать: как указано в комментарии вопроса, этот «шаблон» долженследует избегать из-за того, что он не потокобезопасен, исключителен и хорош.

...