Невозможно использовать объект DependencyObject, принадлежащий другому потоку, чем его родительский объект Freezable - PullRequest
2 голосов
/ 25 января 2012

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

Здесь я создаю свою тему:

public void Start()
    {

         if (_parent != null)
             _parent.IsEnabled = false;

         _thread = new Thread(RunThread);

         _thread.IsBackground = true;
         _thread.SetApartmentState(ApartmentState.STA);
         _thread.Start();

         _threadStarted = true;
         SetProgressMaxValue(10);

         Thread th = new Thread(UpdateProgressBar);
         th.IsBackground = true;
         th.SetApartmentState(ApartmentState.STA);
         th.Start();
    }

И метод потока:

private void RunThread()
    {

        _window = new WindowBusyPopup(IsCancellable);
        _window.Closed += new EventHandler(WaitingWindowClosed);
        _window.ShowDialog();
    }

Теперь, когда выполняется этот момент, я получаю эту ошибку:

Невозможно использовать объект DependencyObject, принадлежащий другому потоку, чем его родительский объект Freezable.

Буду признателен за любую помощь:)

Ответы [ 2 ]

0 голосов
/ 20 июня 2012

Невозможно использовать объект DependencyObject, принадлежащий другому потоку, отличному от его родительского объекта Freezable.

Эта ошибка наблюдается, потому что вы пытаетесь использовать ресурс (типа UIElement), который был создан в другом потоке в вашем потоке STA (который вы используете для отображения всплывающего окна).

В вашем случае это выглядит как вторая нить Thread th = new Thread (UpdateProgressBar); , пытается манипулировать пользовательским интерфейсом в WindowBusyPopup . Поскольку всплывающее окно принадлежит другому потоку, вы получаете это исключение.

Возможное решение: (как я вижу, вы не показываете реализацию функции UpdateProgressBar)

private void UpdateProgressBar()
{
if(_window != null) /* assuming  you declared your window in a scope accesible to this function */
_window.Dispatcher.BeginInvoke(new Action( () => {
// write any code to handle children of window here
}));
}
0 голосов
/ 30 января 2012

Попробуйте использовать свойство Dispatcher формы.Dispatcher.BeginInvoke (...)

Или просто используйте класс BackgroundWorker , поскольку у него есть метод ReportProgress () для отчета о проценте прогресса.Это вызовет событие ProgressChanged, когда вы сможете обновить значение индикатора выполнения или что-то еще ...

...