WPF System.Windows.MessageBox.Show Dispatcher processing has been suspended, but messages are still being processed.

复制代码
 private void SelectedCommandExecuted(object obj)
 {
     if (obj != null && obj is DataGrid dg)
     {
         if (dg != null)
         {
             var selectedBks = dg.SelectedItems;
             if (selectedBks != null && selectedBks.Count > 0)
             {
                 MessageBox.Show($"Selected {selectedBks.Count} Items",
                     "Multi Select", MessageBoxButton.OK);
             }
         }
     }
 }
复制代码

 

 

 

 

The detailed exception as below.

复制代码
System.InvalidOperationException
  HResult=0x80131509
  Message=Dispatcher processing has been suspended, but messages are still being processed.
  Source=WindowsBase
  StackTrace:
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.MessageBox(HandleRef hWnd, String text, String caption, Int32 type)
   at System.Windows.MessageBox.ShowCore(IntPtr owner, String messageBoxText, String caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, MessageBoxOptions options)
   at System.Windows.MessageBox.Show(String messageBoxText, String caption, MessageBoxButton button)
复制代码

 

 

The therapy is to use Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>{}) as below

复制代码
private void SelectedCommandExecuted(object obj)
{
    Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
    {
        if (obj != null && obj is DataGrid dg)
        {
            if (dg != null)
            {
                var selectedBks = dg.SelectedItems;
                if (selectedBks != null && selectedBks.Count > 0)
                {
                    MessageBox.Show($"Selected {selectedBks.Count} Items",
                        "Multi Select", MessageBoxButton.OK);
                }
            }
        }
    }));
}
复制代码

 

posted @   FredGrit  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示