Я создаю приложение типа Todo, в котором пользователь может делать заметки и постоянно перемещать заметки по экрану.При каждом изменении позиции «примечания» мне нужно сохранять его в базе данных:
Типичный код для этого:
private void SaveChanges()
{
if (!_context.IsSubmitting)
{
this.busyIndicator.IsBusy = true;
_context.SubmitChanges(subOp =>
{
this.busyIndicator.IsBusy = false;
if (subOp.Error != null)
{
ErrorWindow window = new ErrorWindow(subOp.Error.Message);
window.Show();
}
}, null);
}
}
Однако, как вы можете видеть, я блокирую UIиспользование busyindicator и остановка пользователя для выполнения каких-либо действий во время отправки.Это плохо, особенно для этого приложения.В качестве альтернативы я попытался переместить этот код в другой поток, используя этот код:
private void SaveChanges()
{
ThreadPool.QueueUserWorkItem(waitcall =>
{
if (!_context.IsSubmitting)
{
//this.busyIndicator.IsBusy = true;
_context.SubmitChanges(subOp =>
{
Dispatcher.BeginInvoke(() =>
{
//this.busyIndicator.IsBusy = false;
if (subOp.Error != null)
{
ErrorWindow window = new ErrorWindow(subOp.Error.Message);
window.Show();
}
});
}, null);
}
});
}
Это работает, и приложение по-прежнему остается отзывчивым.Однако теперь, когда контекст передает изменения, и пользователь работает с той же заметкой, перемещая ее по экрану и т. Д., Привязка пытается изменить свойства объекта, и я получаю исключение:
Этот объект в настоящее времятолько для чтения
Я понимаю, что это очевидно, поскольку контекст представляет изменения.Однако есть ли способ, с помощью которого я могу поддерживать отзывчивость приложения, не показывая индикатор тупой занятости и все еще не получая эти исключения?