Почему мне следует избегать использования Диспетчера?

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

У меня также есть напарник, который избегает использования Dispatcher в своем коде. Я спросил его о причине, но его ответ меня не удовлетворил. Он сказал, что ему не нравится такая «магия», спрятанная в классе.

Ну, я фанат следующего класса.


public class BindingBase : INotifyPropertyChanged
{
   public event PropertyChangedEventHandler PropertyChanged;

   private Dispatcher Dispatcher
   {
#if SILVERLIGHT
      get { return Deployment.Current.Dispatcher; }
#else
      get { return Application.Current.Dispatcher; }
#endif
   }

   protected void RaisePropertyChanged<T>(Expression<Func<T>> expr)
   {
      var memberExpr = (MemberExpression)expr.Body;
      string property = memberExpr.Member.Name;

      var propertyChanged = PropertyChanged;
      if (propertyChanged == null) return;

      if (Dispatcher.CheckAccess())
         propertyChanged.Invoke(this, new PropertyChangedEventArgs(property));
      else
         Dispatcher.BeginInvoke(() => RaisePropertyChanged(expr));
   }
}

Вот вопрос. Есть ли причины, по которым некоторые люди не хотят использовать такой класс? Возможно, мне придется пересмотреть этот подход.

Согласитесь, есть одна странность. Dispatcher.CheckAccess () исключен из Intellisense. Возможно, из-за этого они немного пугают.

С уважением

РЕДАКТИРОВАТЬ:

Хорошо, еще один пример. Рассмотрим сложный объект. Коллекция в качестве примера, возможно, была не лучшей идеей.


public class ExampleVm : BindingBase
{
   private BigFatObject _someData;
   public BigFatObject SomeData
   {
      get { return _someData; }
      set
      {
         _someData = value;
         RaisePropertyChanged(() => SomeData);
      }
   }

   public ExampleVm()
   {
      new Action(LoadSomeData).BeginInvoke(null, null); //I know - it's quick and dirty
   }

   private void LoadSomeData()
   {
      // loading some data from somewhere ...
      // result is of type BigFatObject

      SomeData = result; // This would not work without the Dispatcher, would it?
   }
}
7
задан DHN 7 March 2011 в 11:59
поделиться