2012-02-17 47 views
0

似乎有很多在論壇上找到這些錯誤的調用線程不能訪問這個對象,但我不能將他們大多對我的情況..,因爲不同的線程擁有它

我問題:

我有一個頁面:PosterHome.xaml,它有一個統一的網格。 在我的代碼隱藏,我有一個drawthread:

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

這threadmethod(drawPosters)由另一個類是偶爾喚醒,使用的AutoResetEvent。我得到這個方法的錯誤我改變了統一的網格行的時刻:

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

我應該如何處理呢?提前致謝。

電賀大安

+1

你看哪個論壇的帖子,在和他們爲什麼不適用於您的情況?您是否在尋找關於Dispatcher的帖子? – mbeckish 2012-02-17 14:05:08

+0

如果您的搜索結果完全是您的問題的標題,那麼第一次打擊就會給您一個深刻的解釋。 – Clemens 2012-02-17 14:28:53

+0

我確實嘗試過使用調度程序,但是顯然我做了錯誤的事情,因爲它不適合我......但是我使用了aaron給出的例子,它起作用了! – Daan 2012-02-17 14:36:35

回答

7

你試圖訪問其在UI線程上創建從後臺線程posterUniformGrid

爲了避免這種情況,請使用Dispatcher

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

+1。 Yup:這比我的老同學的答案更符合WPF標準 – 2012-02-17 14:16:43

+0

這對我來說很合適,我嘗試過使用調度程序,但是做錯了。 – Daan 2012-02-17 14:39:01

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); 
      } 
     } 
    } 
相關問題