Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top