public override Task <DialogResult> ShowDialogAsync( object content, string caption, DialogButton dialogButton, DialogImage dialogImage = DialogImage.None, DialogController dialogController = null) { Window mainWindow = GetActiveWindow(); Dispatcher dispatcher = mainWindow != null ? mainWindow.Dispatcher : Dispatcher.CurrentDispatcher; string bodyString = content?.ToString().Parse() ?? string.Empty; string captionString = caption?.Parse() ?? string.Empty; if (dispatcher == null || dispatcher.CheckAccess()) { MessageBoxResult messageBoxResult; try { Interlocked.Increment(ref openDialogCount); if (mainWindow != null) { /* We are on the UI thread, and hence no need to invoke the call.*/ messageBoxResult = MessageBox.Show( mainWindow, bodyString, captionString, dialogButton.TranslateToMessageBoxButton(), dialogImage.TranslateToMessageBoxButton()); } else { messageBoxResult = MessageBox.Show( bodyString, captionString, dialogButton.TranslateToMessageBoxButton(), dialogImage.TranslateToMessageBoxButton()); } } finally { Interlocked.Decrement(ref openDialogCount); } return(Task.FromResult( messageBoxResult.TranslateToMessageBoxResult())); } DialogResult result = DialogResult.OK; /* Satisfy compiler with default value. */ dispatcher.Invoke((ThreadStart) delegate { MessageBoxResult messageBoxResult; try { Interlocked.Increment(ref openDialogCount); if (mainWindow != null) { /* We are on the UI thread, * and hence no need to invoke the call.*/ messageBoxResult = MessageBox.Show(mainWindow, bodyString, captionString, dialogButton.TranslateToMessageBoxButton(), dialogImage.TranslateToMessageBoxButton()); } else { messageBoxResult = MessageBox.Show(bodyString, captionString, dialogButton.TranslateToMessageBoxButton(), dialogImage.TranslateToMessageBoxButton()); } } finally { Interlocked.Decrement(ref openDialogCount); } result = messageBoxResult.TranslateToMessageBoxResult(); }); return(Task.FromResult(result)); }