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 @ 2024-09-22 17:26  FredGrit  阅读(9)  评论(0编辑  收藏  举报