BackgroundWorker vs NotifyPropertyChanged проблема - PullRequest
1 голос
/ 08 октября 2010

У меня есть приложение WPF, которое выполняет некоторые вычисления в BackgroundWorker. Проблема в том, что когда я пытаюсь обновить свойство (которое вызывает NotifyPropertyChanged в установщике) в обработчике события RunWorkerCompleted, я получаю InvalidOperationException - The calling thread cannot access this object because a different thread owns it.

В этой статье MSDN говорится, что BackgroundWorker сам выполняет синхронизацию потоков, поэтому мне не нужно беспокоиться об использовании Dispatcher. Но я вижу, что он не обрабатывает NotifyPropertyChanged правильно.

Кто-нибудь может мне помочь с этим вопросом?

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

Вот мой код (извините за некоторые несущественные функции):

backgroundWorker.DoWork += delegate(object sender, DoWorkEventArgs args)
                                           {
                                               var action = (Func<Bitmap>) args.Argument;
                                               args.Result = BitmapUtil.BitmapSourceFromBitmap(action());
                                           };

backgroundWorker.RunWorkerCompleted += delegate(object sender, RunWorkerCompletedEventArgs args)
                                                       {
                                                           if (args.Cancelled || (args.Error != null))
                                                           {
                                                               return;
                                                           }

                                                           ImageProcessed = (BitmapSource) args.Result;
                                                       };

...

public BitmapSource ImageProcessed
        {
            get { return imageProcessed; }

            set
            {
                imageProcessed = value;
                OnPropertyChanged(VMUtil.GetNameOf<ImageAnalyzerViewModel>(vm => vm.ImageProcessed));
            }
        }

Ответы [ 2 ]

1 голос
/ 08 октября 2010

Проблема не вызвана каким-либо кодом в RunWorkerCompleted. Этот код выполняется в том же потоке, который создал BackgroundWorker. Проблема в методе, который фактически выполняется в фоновом режиме.

Трудно сказать, что это за проблема, не видя этот код. Тот факт, что вы молча отбрасываете любые ошибки, которые выдает метод, вместо того, чтобы регистрировать или сообщать о том, что находится в args.Error, может также войти в проблему.

0 голосов
/ 19 мая 2011

Похоже, это проблема многопоточности, попробуйте это:

public BitmapSource ImageProcessed         
{             
    get
    { 
        return imageProcessed; 
    }              
    set         
    {                 
         imageProcessed = value;   
         // bring the following to the main thread
         Deployment.Current.Dispatcher.BeginInvoke(() =>
         {
            OnPropertyChanged(VMUtil.GetNameOf<ImageAnalyzerViewModel>(vm => vm.ImageProcessed));   
          }); 

  }         
} 
...