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); } } } })); }