Pergunta

Estou processando arquivos grandes depois de serem selecionados pelo usuário. Meu código parece o seguinte:

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

Isso congela a interface do usuário, então tentei exibir uma mensagem de carregamento antes de um usuário selecionar o arquivo para dar a eles uma sugestão visual de que algo estava acontecendo:

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

Infelizmente, isso ainda congela completamente a interface do usuário enquanto o arquivo está sendo processado.

O que eu descobri que funciona perfeitamente é se eu disparar uma caixa de mensagem logo após a seleção de arquivos. Eu acho que ele faz uma chamada do tipo "Doevents" sob o capô para obter itens de eventos/interface do usuário nivelados no tempo de execução.

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

Em casos como esse, o grande arquivo ainda é processado como lentamente, mas a mensagem de carregamento é exibida e a interface do usuário da tela é sincronizada (estou fazendo outras coisas na coisa real, como mostrar um cursor de espera).

Pergunta:

Silverlight não tem funcionalidade doevents. Existe uma chamada que posso fazer além do MessageBox.Show para ter o mesmo efeito de sincronizar a interface do usuário e impedir que o OpenFiledialog de congelar a interface do usuário?

Foi útil?

Solução

Use um trabalho de fundo para executar o cálculo pesado em segundo plano. Quando você deseja notificar a interface do usuário de que a operação está concluída, o evento RunWorkerCompleted da classe mencionado pode ser usado. A alternativa a isso é usar um encadeamento completamente separado e, em seguida, retorno de chamada para o thread da interface do usuário usando o Dispatcher.begininvoke (). Lembre -se de que, com .NET em um encadeamento separado, você não pode acessar nenhum componente da GUI sem esse tipo de sincronização.

Outras dicas

Use a classe BackgroundWorker para processar seu arquivo realmente grande em um thread de segundo plano? Aqui um link para você: Como: usar um trabalho de fundo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top