问题描述
我正在尝试按照问题标题中的内容进行操作。我在 MSDN 上看过,如果您使用线程访问 UI 线程,则需要使用 dispatch 调用。反正这还没有解决我的问题。 这是我的代码,我需要做什么来解决它?谢谢!:
static void example()
{
for (int i = 0; i < amountRows; i++)
{
RowDeFinition rowD = new RowDeFinition();
gridSizes.dispatcher.Invoke(dispatcherPriority.normal,new Action(() => { gridSizes.RowDeFinitions.Add(rowD); }));
Console.WriteLine("added"); // never gets to here cuz the dispatcher produces an exception
}
}
Reproduce:
new Thread(() =>
{
example();
}).Start();
此代码已从 WPF 项目 MainWindow --> Open new Window --> Thread --> Code --> Exception 的一个 Window 的 public void 中调用
解决方法
我相信因为 RowDefinition
也是一个 DependencyObject
,所以您需要在 UI 线程上创建它,以便它与您的 Grid
一起使用。将 RowDefinition rowD = new RowDefinition()
移动到您的 Dispatcher.Invoke
调用中应该可以解决这个问题。
当然,在上面的例子中,第二个威胁毫无意义,因为它本身什么都不做,但我假设在你的完整代码中你有第二个线程实际上在做某事。
,正如@Keith Stein 所说,RowDefinition 是一个 DependencyObject,因此为了从线程调用它,必须使用 Dispatcher.Invoke。
为了解决这个问题,我使用了下一个代码块,它为里面的所有代码调用调度程序。
App.Current.Dispatcher.Invoke((Action)delegate ()
{
//your code here
}