Silverlight OpenFileDialog doevents эквивалент
-
20-09-2019 - |
Вопрос
Я обрабатываю большие файлы после того, как они выбраны пользователем. Мой код выглядит следующим образом:
if (FileDialog.ShowDialog() == true) {
// process really big file
}
Это замораживает пользовательский интерфейс, поэтому я попытался сначала отобразить загрузочное сообщение, прежде чем пользователь выбрал файл, чтобы дать им визуальный сигнал, что что -то происходит:
loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
// process really big file
}
К сожалению, это все еще полностью замораживает пользовательский интерфейс, когда файл обрабатывается.
Я нашел, что работает отлично, это если я запускаю Bessagebox сразу после выбора файла. Я думаю, что это делает вызов типа «doevents» под капюшоном, чтобы получить элементы Event/пользовательского интерфейса во время выполнения.
loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
MessageBox.Show("Sync!");
// process really big file
}
В подобных случаях большой файл все еще обрабатывается как медленно, но отображается загрузочное сообщение, и пользовательский интерфейс экрана синхронизируется (я делаю другие вещи в реальных вещах, таких как показ курсора ожидания).
Вопрос:
Silverlight не имеет функциональности dowevents. Есть ли звонок, который я могу сделать, помимо Messagebox.show, чтобы иметь такой же эффект синхронизации пользовательского интерфейса и предотвращения замораживания пользовательского интерфейса?
Решение
Используйте фоновый работник, чтобы выполнить тяжелые вычисления в фоновом режиме. Если вы хотите уведомить пользовательский интерфейс о том, что операция завершена, может использоваться событие RunworkerCompleted в вышеупомянутом классе. Альтернативой для этого является использование совершенно отдельного потока, а затем обратный вызов в потоке пользовательского интерфейса с использованием Dispatcher.beginInvoke (). Помните, что с .net в отдельном потоке вы не можете получить доступ к каким -либо компонентам графического интерфейса без такого рода синхронизации.
Другие советы
Use the BackgroundWorker class to process your really big file on a background thread? Here a link for you: How to: Use a BackgroundWorker