簡體   English   中英

InvalidOperationException:已暫停調度程序處理,但仍在處理消息

[英]InvalidOperationException: dispatcher processing has been suspended, but messages are still being processed

我們遇到了這個例外的多個問題,但我找不到關於問題真正原因的技術文檔,這個錯誤的所有可能來源以及我們應該避免什么來避免異常。

我看過以下內容:

暫停調度程序處理以避免在更新可視樹時出現重入問題。

但我不確定“更新可視樹”是什么意思,以及是什么原因導致消息被發送到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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM