Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им - PullRequest
5 голосов
/ 24 августа 2011

У меня есть окно WPF в основном потоке. На кнопках часов этого окна я загружаю данные. Между тем я использую отдельный поток для отображения экрана ожидания. Но я не могу установить главное окно в качестве родителя экрана ожидания. Выдает следующую ошибку: Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им

Ответы [ 3 ]

7 голосов
/ 24 августа 2011

Вы хотите изучить метод Dispatcher.Invoke.

5 голосов
/ 24 августа 2011

Вы можете использовать класс BackgroundWorker для выполнения асинхронных операций;он должен позаботиться о любых проблемах с тематикой потоков, которые у вас могут возникнуть.Это так же просто, как подключить пару событий.

Этот должен помочь вам начать.

В качестве альтернативы вы можете использовать Dispatcher.Invoke для выполнения операции надправильная тема:

private void DoStuffOnThread()
{
    Dispatcher.Invoke(new Action(DoStuffOnUIThread));
}

private void DoStuffOnUIThread()
{
    // ...
}
0 голосов
/ 24 августа 2011

Проблема, с которой вы сталкиваетесь, заключается в том, что окна / элементы управления имеют сходство с потоками (они «принадлежат» определенному потоку), и вы не можете смешивать их между потоками.

Если вам нужен родительский экран ожиданиячтобы быть главным окном, вы должны создать экран ожидания в потоке главного окна.Затем в другом потоке вы можете настроить отображение экрана ожидания с помощью Invoke.

Здесь есть хорошая статья о межпоточных операциях в WPF (поиск на рисунке 4 Обновление пользовательского интерфейса):

http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

...