Если это занимает много времени, рассмотрите возможность использования отдельного потока, например, с помощью BackgroundWorker
, чтобы поток пользовательского интерфейса мог оставаться отзывчивым (т.е. обновлять пользовательский интерфейс) во время выполнения операции.
В вашем Save
методе вы бы
- изменение пользовательского интерфейса (то есть изменение некоторого логического значения INotifyPropertyChanged или DependencyProperty
IsBusySaving
, которое связано с вашим пользовательским интерфейсом, скрывает кнопку Сохранить и, возможно, отображает индикатор выполнения с IsIndeterminate = True
) и
- начать
BackgroundWorker
.
В обработчике событий DoWork
вашего BackgroundWorker вы выполняете длительную операцию сохранения.
В обработчике событий RunWorkerCompleted
, который выполняется в потоке пользовательского интерфейса, вы устанавливаете IsBusySaving
в значение false и, возможно, изменяете другие элементы в пользовательском интерфейсе, чтобы показать, что вы закончили.
Пример кода (не проверено):
BackgroundWorker bwSave;
DependencyProperty IsBusySavingProperty = ...;
private MyViewModel() {
bwSave = new BackgroundWorker();
bwSave.DoWork += (sender, args) => {
// do your lengthy save stuff here -- this happens in a separate thread
}
bwSave.RunWorkerCompleted += (sender, args) => {
IsBusySaving = false;
if (args.Error != null) // if an exception occurred during DoWork,
MessageBox.Show(args.Error.ToString()); // do your error handling here
}
}
private void Save() {
if (IsBusySaving) {
throw new Exception("Save in progress -- this should be prevented by the UI");
}
IsBusySaving = true;
bwSave.RunWorkerAsync();
}