2012-02-17 13 views
0

がフォーラムで見つかったこれらのエラーの多くがあるように思わ所有しているので、呼び出し元のスレッドがこのオブジェクトにアクセスすることはできませんが、私は自分の状況にそれらのほとんどを適用することはできません..異なるスレッドが

マイ問題:

私はページがあります:PosterHome.xaml、それに一様なグリッドがあります。

drawThread = new Thread(new ThreadStart(drawPosters)); 
       drawThread.SetApartmentState(ApartmentState.STA); 
       drawThread.Start(); 

このthreadmethod(drawPosters)時折autoreseteventを使用して、別のクラスによってウェイクアップされています。私のコードビハインドで は、私がdrawthreadを持っています。

while (true) 
{ 
    waitEvent.WaitOne(); 
    //do some calculations 
    // change uniform grid rows & cols 
    posterUniformGrid.Rows = calculatedRows; //**-> error is first thrown here** 
    posterUniformGird.Columns = calculatedCols;    
} 

私はこれをどのように処理すればよいですか?前もって感謝します。

は、あなたのバックグラウンドスレッドからUIスレッド上で作成されたposterUniformGridにアクセスしようとしている大安

+1

を? Dispatcherに関する記事を探しましたか? – mbeckish

+0

あなたが質問のタイトルを正確に探せば、最初のヒットはあなたに何が起こっているかの深遠な説明を与えてくれました。 – Clemens

+0

ディスパッチャを使用しようとしましたが、明らかに私は間違っていました。なぜなら、私にとってはうまくいきませんでした。しかし、私はaaronの例を使用しました。 – Daan

答えて

7

挨拶します。

これを避けるには、Dispatcherを利用してください。

Dispatcher.Invoke(DispatcherPriority.Normal, 
        new Action<object[]>(SetGrid), 
        new object[] { calculatedRows, calculatedColumns }); 
+0

+1。はい:これは私の古い学校の回答よりもさらにWPF準拠です –

+0

これは私のために働いた、私はディスパッチャーを使用してみましたが、それは間違った方法でした.. – Daan

0

あなたはこの試みることができる:フォーラムの投稿は、あなたが見たのと、なぜ彼らは自分の状況には適用されません

while (true) 
{ 
    waitEvent.WaitOne(); 
    this.InvokeEx(t => t.posterUniformGrid.Rows = calculatedRows); 
    this.InvokeEx(t => t.posterUniformGird.Columns = calculatedCols);    
} 

public static class ISynchronizeInvokeExtensions 
    { 
     public static void InvokeEx<T>(this T @this, Action<T> action) where T : ISynchronizeInvoke 
     { 
      if (@this.InvokeRequired) 
      { 
       try 
       { 
        @this.Invoke(action, new object[] { @this }); 
       } 
       catch { } 
      } 
      else 
      { 
       action(@this); 
      } 
     } 
    } 
関連する問題