Domanda

Sono l'elaborazione di file di grandi dimensioni dopo che sono stati selezionati dall'utente. Il mio codice è simile al seguente:

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

Questo blocca l'interfaccia utente così ho cercato di visualizzare un messaggio di carico prima che un utente ha selezionato il file per dare loro un segnale visivo che qualcosa stava accadendo:

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

Purtroppo, questo ancora del tutto si blocca l'interfaccia utente, mentre il file è in fase di elaborazione.

Quello che ho trovato che funziona perfettamente è che se licenzio un MessageBox subito dopo la selezione dei file. Penso che fa un "DoEvents" tipo di chiamata sotto il cofano per ottenere elementi evento / ui a filo nella fase di esecuzione.

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

In casi come questo il file grande è ancora elaborato come lentamente ma viene visualizzato il messaggio di caricamento e l'interfaccia utente dello schermo viene sincronizzato up (sto facendo altre cose nel cosa reale come ad esempio mostrando un cursore di attesa).

Domanda:

Silverlight non ha alcuna funzionalità DoEvents. C'è una chiamata che posso fare oltre MessageBox.Show per avere lo stesso effetto di sincronizzare l'interfaccia utente e impedendo l'OpenFileDialog congelamento l'interfaccia utente?

È stato utile?

Soluzione

Usa un BackgroundWorker per eseguire il calcolo pesante in background. Quando si desidera informare l'utente che l'operazione è stata completata, l'evento RunWorkerCompleted della classe di cui sopra può essere utilizzato. L'alternativa a questo è di utilizzare un filo completamente separato e poi richiamata al thread UI utilizzando Dispatcher.BeginInvoke (). Ricordate che con .NET in un thread separato non è possibile accedere a tutti i componenti della GUI senza questo tipo di sincronizzazione.

Altri suggerimenti

Utilizzare la classe BackgroundWorker per elaborare la vostra davvero grande file su un thread in background? Ecco un link per voi: Procedura: utilizzare un BackgroundWorker

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top