Проблемы с Dispatcher.Invoke и потоком доступа - PullRequest
2 голосов
/ 17 мая 2011

Я пытаюсь обработать потоки в C #, но у меня возникло странное исключение, которое я не знаю, как решить.У меня есть метод, запущенный BackgroundWorker, в котором есть следующий фрагмент кода:

GridView gridView;
DataView dataView;

queryTable.GetViewAndDataView(out gridView, out dataView);

this.listView.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(
    delegate() {
        listViewView = gridView;                    
        listView.ItemsSource = dataView;
    }
));

GetViewAndDataView заполняет gridView и dataView, в то время как код делегата устанавливает текущий listView.Предполагается, что использование Invoke не вызывает исключений, но когда я пытаюсь запустить его, я получаю следующее: Вызывающий поток не может получить доступ к этому объекту, поскольку другой поток владеет им .

Любойзнает, как обработать такое исключение, или, по крайней мере, как отключить владение объектом потока?

Ответы [ 2 ]

5 голосов
/ 17 мая 2011

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

2 голосов
/ 17 мая 2011

Вам нужно сохранить this.listView.Dispatcher в некоторой локальной переменной, прежде чем запускать параллельный поток.В thred вы должны использовать диспетчер из этой переменной.

Однако @ Правильность - вы должны создавать элементы управления / элементы в потоке пользовательского интерфейса.В параллельных потоках вы можете создавать только не-пользовательские объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...