我们遇到了这个例外的多个问题,但是我找不到关于问题真正原因的技术文档,这个错误的所有可能来源以及我们应该避免哪些以避免出现异常。
我已阅读以下内容:
暂停调度程序处理以避免重入问题 更新可视化树时。
但我不确定“更新可视树”是什么意思,以及是什么原因导致邮件被发送到Dispatcher并重现问题。
以下示例代码重现了该问题:
XAML
<Window x:Class="SuspendedPOF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="350"
Width="525">
<StackPanel>
<Button Content="1" x:Name="Button1" IsVisibleChanged="Button1_OnIsVisibleChanged" />
</StackPanel>
</Window>
C#代码
using System.Windows;
namespace SuspendedPOF
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button1_OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
MessageBox.Show("Hello");
}
}
}
MessageBox调用不是唯一一个触发此异常的函数,像Focus这样的东西有时也会出现问题。
任何帮助都会很棒。
答案 0 :(得分:5)
重点是,您可能正在尝试在事件处理程序中更改按钮的可视状态,以管理其可视更改(即其可见性)。这可能会导致无限循环(当您阅读时出现“重入问题”),这也是您获得InvalidOperationException
的原因。
要避免此问题,您必须使用Dispatcher推迟MessageBox
开头。然后在Button1_OnIsVisibleChanged
方法中,使用以下代码:
Dispatcher.BeginInvoke(new Action(() => System.Windows.MessageBox.Show("Hello")),
System.Windows.Threading.DispatcherPriority.Normal);
而不是直接调用MessageBox
Show
静态方法。
答案 1 :(得分:0)
据我所知,无法知道何时处理可以修改控件可视状态的事件,也无法知道您的操作是否会修改UI的可视状态,因此它只是无论什么时候发现崩溃都会把BeingInvokes放进去......:S