Безопасен ли поток NotifyPropertyChanged? - PullRequest
4 голосов
/ 27 октября 2011

Я смотрю на NotifyPropertyChanged() из INotifyPropertyChanged и заметил, что в примерах от Microsoft, таких как здесь:

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

Сначала не происходит захват ссылки на делегат (как сказано здесь, например: Использование проверки на ноль в обработчике событий )

Я посмотрел в автоматически сгенерированном Reference.cs для моих ServiceReferences, и эта проверка выполнена.

Итак, мой вопрос, должен ли я это делать (в какой-либо форме, такой как методы расширения и т. Д.)? Есть ли возможные проблемы, если я не буду?

1 Ответ

7 голосов
/ 27 октября 2011

Вы правы, проверка должна быть выполнена, а их пример неверен.

Ниже приведен стандартный код.

private void NotifyPropertyChanged(String propertyName)
{
    var handler = PropertyChanged;
    if (handler != null)
    {
        handler (this, new PropertyChangedEventArgs(propertyName));
    }
}

Редактировать: Дальнейшее объяснение того, почему это нужно (и почему это работает)

В примере с MS они проверяют NULL прямо на PropertyChanged и затем вызывают его. Таким образом, PropertyChanged мог бы стать пустым между проверкой нуля и вызовом. Присвоив делегат локальной переменной, мы можем гарантировать, что мы сохраним ссылку на делегат, и она не сможет переключаться между проверкой на ноль и вызовом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...