在论坛上似乎发现了很多这些错误,但我无法将大部分错误应用于我的情况..
我的问题:
我有一个页面: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
答案 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);
}
}
}