2013-01-30 3 views
-2

В моем проекте у меня есть busyindicator, и я использую ListObject в FirstMethod и SecondMethod.Вызывающая нить не может получить доступ к объекту, потому что другой поток принадлежит ему

Программа выдает следующую ошибку:

The calling thread cannot access the object because a different thread owns it

Я использую следующий код:

public static readonly DependencyProperty ListObjectProperty = 
    DependencyProperty.Register("ListObject", typeof(ObservableCollection<FileViewModel>), typeof(MyObjectViewModel), new PropertyMetadata(ChangeCallback)); 

public ObservableCollection<FileViewModel> ListObject 
{ 
    get { return (ObservableCollection<FileViewModel>)GetValue(ListObjectProperty); } 
    set { SetValue(ListObjectProperty, value); } 
} 

private void SelectedPath() 
{ 
    NavigatePage(new Page2());    
    FirstMethod(); 
} 


private void FilesCase() 
{ 
    var t = new Task(() => this.ThreadFilesCase()); 

    t.ContinueWith(
     (o) => 
     { 
      Dispatcher.BeginInvoke(new Action(() => 
      { 
       IsBusy = false; NavigatePage(new Page3()); 
      })); 
     }); 

    IsBusy = true;  
    t.Start(); 
} 

private void ThreadFilesCase() 
{ 
     SecondMethod();  
} 
+0

проверил ли вы это? http://stackoverflow.com/questions/10764747/exception-the-calling-thread-cannot-access-this-object-because-a-different-thr Вам, вероятно, потребуется настроить делегат и вызвать его. – Corey

+0

Есть ли что-нибудь в 'SecondMethod', которое обращается к' UIElement' –

+0

Это, скорее всего, связано с многопоточным. Я все равно ответил, помогая вам с вашей конкретной проблемой. Попробуйте прочитать некоторые материалы по многопоточности и обновить элементы управления ui из другого потока. –

ответ

1

Вы звоните Dispatcher.BeginInvoke, withtin на ContinueWith делегата. Это означает, что он ссылается на поток backgroundworker. Используйте Диспетчер, полученный из элемента управления ui. Или используйте SynchronizationContext, который используется при создании элементов управления ui.

Пример: myBusyIndicator.Dispatcher.Invoke(...), а не от Dispatcher.Invoke(...)

+0

Я не использую myBusyIndicator, в моем xaml - zrab

+1

Затем дайте вашему индикатору имя, чтобы вы могли получить к нему доступ в коде позади –

+0

Это проект страницы навигации с собственным представлениемМодель для каждой страницы. Я не могу разрешить имя индикатора в MyViewModel – zrab