C# 调用线程无法访问此对象,因为其他线程拥有它

C# 调用线程无法访问此对象,因为其他线程拥有它,c#,wpf,multithreading,C#,Wpf,Multithreading,论坛上似乎发现了很多这样的错误,但我无法将其中的大部分应用于我的情况 我的问题: 我有一个页面:PosterHome.xaml,上面有一个统一的网格。 在我的代码隐藏中,我有一个抽绳: drawThread = new Thread(new ThreadStart(drawPosters)); drawThread.SetApartmentState(ApartmentState.STA); drawThread.Start();

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

我的问题:

我有一个页面:PosterHome.xaml,上面有一个统一的网格。 在我的代码隐藏中,我有一个抽绳:

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;             
}
我该怎么处理?提前谢谢


欢迎Daan

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

要避免这种情况,请利用

Dispatcher.Invoke(DispatcherPriority.Normal,
新行动(SetGrid),
新对象[]{calculatedRows,calculatedColumns});
您可以尝试以下方法:

 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);
            }
        }
    }
while(true)
{
waitEvent.WaitOne();
this.InvokeEx(t=>t.posterUniformGrid.Rows=calculatedRows);
this.InvokeEx(t=>t.posterUniformGird.Columns=calculatedCols);
}
公共静态类IsSynchronizeInvokeeExtensions
{
公共静态void InvokeEx(this T@this,Action-Action),其中T:ISynchronizeInvoke
{
如果(@this.invokererequired)
{
尝试
{
@调用(action,新对象[]{@this});
}
捕获{}
}
其他的
{
行动(@this);
}
}
}

你看过哪些论坛帖子,为什么它们不适用于你的情况?你找过关于Dispatcher的帖子吗?如果你在谷歌上搜索了你问题的标题,那么第一次点击给了你一个深刻的解释。我确实尝试过使用Dispatcher,但显然我做了一些错误的事情,因为它对我不起作用。但是我使用了aaron给出的例子,它成功了+1.是的:这比我以前的答案更符合WPF
 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);
            }
        }
    }