2009-11-13 3 views
1

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

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

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

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

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

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

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

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

Вопрос:

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

ответ

1

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

2

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

Смежные вопросы