private Task CreateSplash()
        {
            return(STATaskFactory.StartNew(() =>
            {
                var splash = new Splash();
                splash.Closed += (s, e) =>
                                 Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);

                splash.Show();

                LoadingManager.Instance.SplashVM = splash.ViewModel;

                _isSplashCreated = true;
                Dispatcher.Run();
            }));
        }
        private static Task <IProgressDialogController> ShowExternalProgressDialogAsync(string title, string message, bool isCancellable)
        {
            IProgressDialogController controller = null;

            STATaskFactory.StartNew(() =>
            {
                var shellHandle = (IntPtr)Application.Current.Dispatcher.Invoke(new Func <IntPtr>(
                                                                                    () => new WindowInteropHelper(Application.Current.MainWindow).Handle));

                var dialog    = new ProgressDialog(shellHandle);
                var shellRect = (Rect)Application.Current.Dispatcher.Invoke(new Func <Rect>(
                                                                                () => new Rect(Application.Current.MainWindow.WindowState == WindowState.Maximized ? 0 : Application.Current.MainWindow.Left,
                                                                                               Application.Current.MainWindow.WindowState == WindowState.Maximized ? 0 : Application.Current.MainWindow.Top,
                                                                                               Application.Current.MainWindow.ActualWidth,
                                                                                               Application.Current.MainWindow.ActualHeight)));

                dialog.Left   = shellRect.Left;
                dialog.Top    = shellRect.Top;
                dialog.Width  = shellRect.Width;
                dialog.Height = shellRect.Height;

                dialog.Title         = title;
                dialog.Message       = message;
                dialog.IsCancellable = isCancellable;

                dialog.Closed += (s, e) =>
                                 Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);

                dialog.AnimateAndShow();

                controller = dialog.ProgressDialogController;

                Dispatcher.Run();
            });

            return(Task.Factory.StartNew(() =>
            {
                while (controller == null)
                {
                    Thread.Sleep(10);
                }

                return controller;
            }));
        }