Без использования дополнительных потоков я бы просто хотел показать ярлык «Загрузка» или что-то похожее на пользователя, когда читается или записывается большой объем данных. Если я, однако, попытаюсь изменить любые элементы пользовательского интерфейса до, вызвав метод ввода-вывода, приложение замерзает на некоторое время, а затем отображает сообщение «Загрузка» после, все работы уже выполнены. Это явно не помогает. Как я могу гарантировать, что любые изменения пользовательского интерфейса применяются и отображаются до, вызывающих метод ввода-вывода?Как заставить приложение ждать обновления моего интерфейса?
DataSet ds = STT_Import.ImportExcelToDataSet(filePath);
bool result = false;
if (ds != null)
{
int cellCount = ds.GetTotalCellCount();
if (Popup.ShowMessage(string.Format("Your file contains {0} cells. Inserting data will take approximately {1} seconds. Do you want to continue?",
cellCount, CalculateTime(cellCount)), "Confirm", MessageType.Confirm) == MessageBoxResult.Yes)
{
// Tell user the application is working:
StatusLabel.Content = "Writing to database...";
// Do actual work after user has been notified:
result = DB.StoreItems(_currentType, ds);
}
}
Я пытался искать ответы, но не смогли найти ничего, что ответили на мой конкретный вопрос, поэтому я прошу прощения, если вопрос был задан ранее.
Ну есть Application.DoEvents(), но я считаю, что Verboten (у него есть много вопросов). Я всегда говорю, что вы должны делать многопоточность правильно - в этом случае, используя BackgroundWorker. –
Я согласен с Мэтью .... Используйте BackgroundWorker ... http://stackoverflow.com/questions/5483565/how-to-use-wpf-background-worker – PGallagher
Вы не можете быть уверены, что пользователь не будет взаимодействовать с пользовательским интерфейсом после того, как начнется длительный запуск ввода-вывода. –