2016-10-02 2 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); 

例外は、それが別のスレッド上にあるため、それはオブジェクトを使用することはできませんと言っています。

答えて

0

あなたはあなたの状態を前に持っています。 Dispatcher.CheckAccessためthe documentationごとに、それが返されます。

呼び出し元のスレッドがこのディスパッチャに関連付けられているスレッドである場合。それ以外の場合はfalseです。あなたはそれがfalseを返す場合にInvokeを呼び出す必要が

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を使い始めるときには、共通の問題であること

を所有しているので、呼び出し元のスレッドがこのオブジェクトにアクセスすることはできませんメインスレッド以外のスレッドからUI要素を更新する(ケース "RootGrid")

プロジェクトのアーキテクチャを確認する必要があります。この例外を回避するには、イベントハンドラを使用する必要があります。

関連する問題