2016-10-02 11 views
0

У меня возникла проблема с событием, которое приходит из другого потока, я не могу вызвать свою функцию в первой теме.Получение ошибки, что я не могу использовать объект, потому что он находится на неправильном потоке

Это код:

namespace Gestion_Photo_CM 
{ 
    /// <summary> 
    /// Logique d'interaction pour MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 

     GestionRecherche gRech = new GestionRecherche(); 
     Dispatcher disp = Dispatcher.CurrentDispatcher; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      gRech.evt_creer_objimage += afficherimage; 
     } 

     /// <summary> 
     /// Affichage dynamique des images 
     /// </summary> 
     /// <param name="path"></param> 
     public void afficherimage(Image obj) 
     { 
      if (disp.CheckAccess()) 
      { 
       this.Dispatcher.Invoke(delegate() { afficherimage(obj); }); 
      } 
      else 
      { 
       this.RootGrid.Children.Add(obj); 
      } 
     } 

     /// <summary> 
     /// Validation du chemin entré 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 
     private void btn_valid_Click(object sender, RoutedEventArgs e) 
     { 
      string cheminDossier = tbfolderpath.Text; 
      Thread thScanDossier = new Thread(delegate() { gRech.ScanDossiers(cheminDossier); }); 
      thScanDossier.SetApartmentState(ApartmentState.STA); 
      thScanDossier.Start(); 
     } 
    } 
} 

Когда программа доходит до этой строки:

this.RootGrid.Children.Add(obj); 

Исключение говорит, что он не может использовать объект, поскольку он находится на другом Thread.

ответ

0

У вас есть свое состояние спереди. Per the documentation для Dispatcher.CheckAccess, он возвращает:

правда, если вызывающий поток поток, связанный с этим диспетчером; в противном случае, false.

Вы должны вызвать Invoke в случае возвращает false:

if (this.Dispatcher.CheckAccess()) 
{ 
    this.RootGrid.Children.Add(obj); 
} 
else 
{ 
    this.Dispatcher.Invoke(delegate() { afficherimage(obj); }); 
} 

Я также настоятельно рекомендую смотреть на Task.Run вместо того чтобы работать непосредственно с Thread.

+0

Спасибо за ваш ответ парень. Я просто пропустил! символ в этой строке, но он делает то же самое, когда я его тестирую. –

+0

@ C.MARTIN, в этом случае проблема заключается в том, что вы создаете 'Image' на фоновом потоке. –

-1

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

Это общая проблема, когда люди начала работы с WPF, основная причина этого исключения, потому что вы пытаетесь обновить элемент пользовательского интерфейса из потока, отличного от основного потока (в вашем случае «RootGrid»)

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

Счастливый Coding

 Смежные вопросы

  • Нет связанных вопросов^_^