문제

사용자가 대용량 파일을 선택한 후 처리하고 있습니다.내 코드는 다음과 같습니다.

if (FileDialog.ShowDialog() == true) { 
    // process really big file
}

이로 인해 UI가 정지되므로 사용자가 파일을 선택하기 전에 먼저 로딩 메시지를 표시하여 무언가 일어나고 있다는 시각적 신호를 제공하려고 했습니다.

loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) { 
    // process really big file
}

안타깝게도 파일이 처리되는 동안 UI가 완전히 정지됩니다.

내가 찾은 완벽하게 작동하는 것은 파일 선택 직후에 MessageBox를 실행하는 것입니다.내 생각에는 런타임에 플러시 이벤트/UI 항목을 가져오기 위해 내부적으로 "DoEvents" 유형 호출을 수행하는 것 같습니다.

loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
    MessageBox.Show("Sync!");
    // process really big file
}

이런 경우에도 큰 파일은 여전히 ​​느리게 처리되지만 로딩 메시지가 표시되고 화면 UI가 동기화됩니다. (실제로는 대기 커서를 표시하는 등 다른 작업을 수행하고 있습니다.)

질문:

Silverlight에는 DoEvents 기능이 없습니다.UI를 동기화하고 OpenFileDialog가 UI를 정지시키는 것을 방지하는 동일한 효과를 주기 위해 MessageBox.Show 외에 호출할 수 있는 것이 있습니까?

도움이 되었습니까?

해결책

BackgroundWorker를 사용하여 백그라운드에서 무거운 계산을 실행합니다.작업이 완료되었음을 UI에 알리고 싶을 때는 앞서 언급한 클래스의 RunWorkerCompleted 이벤트를 사용할 수 있습니다.이에 대한 대안은 완전히 별도의 스레드를 사용한 다음 Dispatcher.BeginInvoke()를 사용하여 UI 스레드에 콜백하는 것입니다.별도의 스레드에 있는 .NET을 사용하면 이러한 종류의 동기화 없이는 GUI 구성 요소에 액세스할 수 없습니다.

다른 팁

BackgroundWorker 클래스를 사용하여 백그라운드 스레드에서 매우 큰 파일을 처리하시겠습니까?여기 링크가 있습니다: 어떻게:BackgroundWorker 사용

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top