调用线程无法访问此对象,因为另一个线程拥有它

时间:2012-02-17 14:01:20

标签: c# wpf multithreading

在论坛上似乎发现了很多这些错误,但我无法将大部分错误应用于我的情况..

我的问题:

我有一个页面: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;             
}

我应该如何处理?提前谢谢。

Greets Daan

2 个答案:

答案 0 :(得分:7)

您正在尝试访问从后台线程在UI线程上创建的posterUniformGrid

要避免这种情况,请使用Dispatcher

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

答案 1 :(得分: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);
            }
        }
    }