Show()이후, 큰 작업 수행 화면 출력

ProgressBar를 활용해서 먼저 사용자에게 진행상황 다이얼로그를 보여주고, 큰 작업을 수행하면서 진행상황을 뿌려주는 화면을 구현 중에 궁금한 사항이 있어서 질문드립니다.

async void GetLargeLogs()
{
  progressDlg.Show();
  IList<Log> logs = await Task.Run(() => LoadLargeLogs(ProgressDlg.progress));
  progressDlg.Close();

  ShowLogs(logs);
}

위와 같이 UIThread에서 로그들을 불러오지 않고 Thread를 새로 생성 후 로그를 불러오면 progressDlg가 출력되면서 작업 후, progressDlg를 종료하는 로직이 완벽하게 동작합니다.

void GetLargeLogs()
{
  progressDlg.Show();
  IList<Log> logs = LoadLargeLogs(ProgressDlg.progress);
  progressDlg.Close();

  ShowLogs(logs);
}

위와 같이 UIThread에서 로그들을 불러오면 프로그래스 화면이 보이지 않고 화면이 멈춰있다가 로그들이 다 불러와져요. UI 쓰레드를 사용하니까, 로그들을 불러오는 동안 화면이 멈춘다는 것은 이해가 되는데, 궁금한 것은 progressDlg.Show()가 먼저 호출했음에도 불구하고, 프로그래스 화면이 왜 보이지 않는 것인지 궁금합니다.

밑부분에 다음과 같이 아무 작업을 하지 않는 메서드를 동기로 호출함과 동시에 디스패처 우선순위를 한번 적용해 보시겠어요?

this.Dispatcher.Invoke(
    (System.Threading.ThreadStart)(() => { }), DispatcherPriority.ApplicationIdle);
3개의 좋아요

프로그레스 화면이 보이지 않는게 아니라,
프로그레스 화면이 뜨기도 전에 다음 명령으로 멈춰버린겁니다.
그리고, 다음 명령이 끝나자마자 Close()를 해버리니까 눈에 보이기도 전에 닫혀버린거죠.
progressDlg의 생성자와 Load(), Shown() 이벤트에 디버그 메세지를 출력해보면 알겁니다.

4개의 좋아요