Ошибка: необходимо создать DependencySource в том же потоке, что и DependencyObject, даже с помощью Dispatcher

Следующее является частью моего View, в котором я привязал изображение к свойству в ViewModel:

My ViewModel:

public class MainWindowViewModel : INotifyPropertyChanged
{
 public BitmapImage Image
 {
 get { return _image; }
 set
 {
 _image = value;
 OnPropertyChanged();
 }
 }
 Action _makeScannerAlwaysOnAction;
 private BitmapImage _image;
 public MainWindowViewModel()
 {
 AddNewPersonCommand = new RelayCommand(OpenFrmAddNewPerson);
 FingerPrintScannerDevice.FingerPrintScanner.Init();
 MakeScannerAlwaysOn(null);
 }
 private void MakeScannerAlwaysOn(object obj)
 {
 _makeScannerAlwaysOnAction = MakeScannerOn;
 _makeScannerAlwaysOnAction.BeginInvoke(Callback, null);
 }
 private void Callback(IAsyncResult ar)
 {
 FingerPrintScannerDevice.FingerPrintScanner.UnInit();
 var objFingerPrintVerifier = new FingerPrintVerifier();
 objFingerPrintVerifier.StartVerifingProcess();
 var ms = new MemoryStream();
 ms.Position = 0;
 objFingerPrintVerifier.MatchPerson.Picture.Save(ms, ImageFormat.Png);
 var bi = new BitmapImage();
 bi.BeginInit();
 bi.StreamSource = ms;
 bi.EndInit();
 Thread.Sleep(2000);
 Dispatcher.CurrentDispatcher.Invoke(() => Image = bi);
 //Image = bi;
 _makeScannerAlwaysOnAction.BeginInvoke(Callback, null);
 }
 private void MakeScannerOn()
 {
 while (true)
 {
 if (FingerPrintScannerDevice.FingerPrintScanner.ScannerManager.Scanners[0].IsFingerOn)
 {
 return;
 }
 }
 }
 public event PropertyChangedEventHandler PropertyChanged;
 [NotifyPropertyChangedInvocator]
 protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
 {
 var handler = PropertyChanged;
 if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
 }
}

Моя проблема: Проблема в том, что когда я хочу связать изображение, он дает мне ошибку

Должен создать DependencySource в том же потоке, что и DependencyObject

У меня много googled, и я видел пост в SO, но ни один из них не работал у меня.

любая помощь будет очень оценена.

1 ответ

BitmapImage есть DependencyObject, поэтому имеет значение, в каком потоке он создан, потому что вы не можете получить доступ к DependencyProperty объекта, созданного в другом потоке, если это не Freezable, и вы можете Freeze его.

Делает текущий объект немодифицируемым и устанавливает его свойство IsFrozen в true.

Что вам нужно сделать, это вызвать Freeze перед обновлением Image:

bi.BeginInit();
bi.StreamSource = ms;
bi.EndInit();
bi.Freeze();
Dispatcher.CurrentDispatcher.Invoke(() => Image = bi);

как указано @AwkwardCoder, здесь Обзор замороженных объектов

licensed under cc by-sa 3.0 with attribution.