ShowDialog не показывает диалог - PullRequest
0 голосов
/ 13 июля 2020

Я хочу показать другую форму с загрузкой gif при выполнении асинхронного c. Есть идеи, почему выполняется первый TowerPinsVisu, а после этого ShowDialog?

private void RunTasks()
    {
         var tskShowLoadingForm=new Task(() => {
         loadingForm.ShowDialog("OPTIMIZING...");
         });
         tskShowLoadingForm.Start();
         var tskVisualizeTowerPins = new Task(() => TowerPinsVisu());
         tskVisualizeTowerPins.Start();
    }

  public void ShowDialog(string text)
        {
            lblLoadingInfo.Dispatcher.Invoke(() => lblLoadingInfo.Content = text);
            this.Dispatcher.Invoke(()=> ShowDialog());
        }

1 Ответ

0 голосов
/ 13 июля 2020

Не меняя потока, вы должны запустить TowerPinsVisu() в фоновом потоке, используя Task.Run. Пока этот поток запущен, вы можете показать диалог. Вы можете присоединить к Task продолжение, которое будет выполнено после того, как Task завершится. Передавая SynchronizationContext потока пользовательского интерфейса в продолжение, вы можете заставить это продолжение выполняться в потоке пользовательского интерфейса (что необходимо для закрытия диалогового окна:

// If this method executes on the UI thread...
private void RunTasks()
{
  // Start a background thread and continue immediately to show the modal screen.
  Task.Run(TowerPinsVisu)
    .ContinueWith(task => loadingForm.Close(), TaskScheduler.FromCurrentSynchronizationContext());

  loadingForm.ShowDialog("OPTIMIZING...");
}

// ...then this method will too => No need to use a Dispatcher at this point
public void ShowDialog(string text)
{
  lblLoadingInfo.Content = text;
  ShowDialog();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...