У меня есть приложение WPF / MVVM с данными и большим количеством записей.Пользователь может выбрать столько записей, сколько он хочет обновить одно или несколько свойств для всех записей.Если пользователь нажимает кнопку обновления, мой бэкэнд обработает изменения и обновит все записи в базе данных.Однако каждое изменение должно быть отправлено в некоторые другие системы.Сам запрос на обновление не занимает много времени, изменения в других системах занимают больше времени.
Итак, скажем, пользователь выбирает 2000 строк для обновления.Пользователи в большинстве случаев безразличны и не любят ждать, хотя это всего 3 секунды.Я сделал следующее:
if(totalSelectedRows > 1000) { SplitUpdateRequest(); }
else { Update(selectedRows); }
Я в основном говорю, что если выбрано более 1000 строк, команда обновления будет разделена на несколько команд обновления по 100 строк в каждой.Поэтому для 2000 строк я вызываю метод обновления 20 раз синхронно.После каждого звонка я буду знать, если обновление прошло успешно.Я использую эти знания, чтобы показать прогресс-бар.Я делаю это потому, что теперь некоторые пользователи просто закрывают приложение и пробуют снова и снова, в результате чего бэкэнд должен обрабатывать много входящих запросов.Кажется, что все это работает, как и ожидалось, но я считаю, что должно быть другое решение / способ справиться или показать некоторый прогресс, чтобы пользователь знал, что происходит.Есть какие-нибудь предложения, чтобы сделать это по-другому?У меня нет возможности что-либо изменить в обратном направлении.
Ниже моего кода:
Viewmodel:
private AsyncRelayCommand updateCommand;
public ICommand UpdateCommand
{
get
{
return updateCommand ?? (updateCommand = new AsyncRelayCommand(Update));
}
}
private async Task Testing() => await Task.Run(() =>
{
// If more than 1000 records, then the request will be seperated into multiple synchronous update commands
if (selectedRecords?.Count() > 1000)
{
TotalRequests = (int)Math.Ceiling((double)selectedRecords.Count() / 1000);
CurrentRequest = 0;
ProgressPercentage = 0;
for (int i = 0; i < TotalRequests; i++)
{
_service.update(selectedRecords);
CurrentRequest++;
ProgressPercentage = (int)(((double)CurrentRequest / (double)TotalRequests) * 100);
}
}
else
_service.update(selectedRecords);
});
View:
<ProgressBar Minimum="0" Maximum="100" Value="{Binding ProgressPercentage, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text="{Binding ProgressPercentage, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, StringFormat={}{0:0}%}"/>