Silverlight OpenFileDialog DoEvents эквивалент - PullRequest
1 голос
/ 13 ноября 2009

Я обрабатываю большие файлы после того, как они выбраны пользователем. Мой код выглядит следующим образом:

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

Это замораживает пользовательский интерфейс, поэтому я попытался отобразить сообщение о загрузке, прежде чем пользователь выбрал файл, чтобы дать ему визуальную подсказку о том, что что-то происходит:

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

К сожалению, это все еще полностью замораживает пользовательский интерфейс во время обработки файла.

То, что я нашел, работает отлично, если я запускаю MessageBox сразу после выбора файла. Я думаю, что он выполняет вызов типа «DoEvents» изнутри, чтобы получить элементы события / пользовательского интерфейса сброса во время выполнения.

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

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

Вопрос:

Silverlight не имеет функциональности DoEvents. Есть ли еще какой-то вызов, который я могу сделать, кроме MessageBox.Show для того же эффекта синхронизации интерфейса пользователя и предотвращения его зависания OpenFileDialog?

Ответы [ 2 ]

2 голосов
/ 13 ноября 2009

Использовать класс BackgroundWorker для обработки вашего действительно большого файла в фоновом потоке? Вот ссылка для вас: Как: использовать BackgroundWorker

1 голос
/ 13 ноября 2009

Используйте BackgroundWorker для выполнения сложных вычислений в фоновом режиме. Если вы хотите уведомить пользовательский интерфейс о завершении операции, можно использовать событие RunWorkerCompleted вышеупомянутого класса. Альтернативой этому является использование совершенно отдельного потока, а затем обратный вызов в потоке пользовательского интерфейса с помощью Dispatcher.BeginInvoke (). Помните, что с .NET в отдельном потоке вы не можете получить доступ к любым компонентам графического интерфейса без такой синхронизации.

...