2012-02-17 74 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); 
      } 
     } 
    } 
相关问题