InvalidOperationException:调度程序处理已暂停,但消息仍在处理中
InvalidOperationException: dispatcher processing has been suspended, but messages are still being processed
我们遇到了与此异常有关的多个问题,但我找不到有关问题真正原因的技术文档、此错误的所有可能来源以及我们应该避免什么以避免出现异常。
我已阅读以下内容:
The dispatcher processing is suspended to avoid reentrancy problems
when updating the visual tree.
但我不确定 'updating the visual tree' 的含义以及导致向 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 之类的调用有时也会有问题。
任何帮助都会很棒。
关键是您可能试图在管理其视觉变化(即其可见性)的事件处理程序中更改按钮的视觉状态。这可能会导致无限循环(如您所读的“重入问题”),这也是您获得 InvalidOperationException
的原因。
为避免此问题,您必须使用 Dispatcher 推迟 MessageBox
开盘。然后在Button1_OnIsVisibleChanged
方法中,使用这段代码:
Dispatcher.BeginInvoke(new Action(() => System.Windows.MessageBox.Show("Hello")),
System.Windows.Threading.DispatcherPriority.Normal);
而不是直接调用 MessageBox
Show
静态方法。
据我所知,无法知道您何时处理可以修改控件视觉状态的事件,也无法知道您的操作是否会修改 UI 所以只要发现崩溃就放置 BeingInvokes ... :S
我们遇到了与此异常有关的多个问题,但我找不到有关问题真正原因的技术文档、此错误的所有可能来源以及我们应该避免什么以避免出现异常。
我已阅读以下内容:
The dispatcher processing is suspended to avoid reentrancy problems when updating the visual tree.
但我不确定 'updating the visual tree' 的含义以及导致向 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 之类的调用有时也会有问题。
任何帮助都会很棒。
关键是您可能试图在管理其视觉变化(即其可见性)的事件处理程序中更改按钮的视觉状态。这可能会导致无限循环(如您所读的“重入问题”),这也是您获得 InvalidOperationException
的原因。
为避免此问题,您必须使用 Dispatcher 推迟 MessageBox
开盘。然后在Button1_OnIsVisibleChanged
方法中,使用这段代码:
Dispatcher.BeginInvoke(new Action(() => System.Windows.MessageBox.Show("Hello")),
System.Windows.Threading.DispatcherPriority.Normal);
而不是直接调用 MessageBox
Show
静态方法。
据我所知,无法知道您何时处理可以修改控件视觉状态的事件,也无法知道您的操作是否会修改 UI 所以只要发现崩溃就放置 BeingInvokes ... :S