InvalidOperationException:已暂停调度程序处理,但仍在处理消息

Ign*_*cia 4 .net c# wpf dispatcher invalidoperationexception

我们遇到了这个例外的多个问题,但是我找不到关于问题真正原因的技术文档,这个错误的所有可能来源以及我们应该避免什么来避免异常.

我看过以下内容:

暂停调度程序处理以避免在更新可视树时出现重入问题.

但我不确定"更新可视树"的含义以及导致消息被发送到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>
Run Code Online (Sandbox Code Playgroud)

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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

MessageBox调用不是唯一一个触发此异常的函数,像Focus这样的东西有时也会出现问题.

任何帮助都会很棒.

Il *_*Vic 5

关键是您可能正在尝试在事件处理程序中更改按钮的可视状态,以管理其可视更改(即其可见性).这可能会导致无限循环(当您阅读时出现 " 重入问题 "),这也是InvalidOperationException您获得的原因.

要避免此问题,您必须MessageBox使用Dispatcher延迟打开.然后在该Button1_OnIsVisibleChanged方法中,使用以下代码:

Dispatcher.BeginInvoke(new Action(() => System.Windows.MessageBox.Show("Hello")),
    System.Windows.Threading.DispatcherPriority.Normal);
Run Code Online (Sandbox Code Playgroud)

而不是直接调用MessageBox Show静态方法.


Ign*_*cia 0

据我所知,没有办法知道您何时处理可以修改控件视觉状态的事件,也没有办法知道您的操作是否会修改 UI 的视觉状态,所以这只是一个问题每当你发现崩溃时就放置BeingInvokes...:S