MVVM индикатор выполнения для длинных внутренних запросов - PullRequest
0 голосов
/ 04 марта 2019

У меня есть приложение 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}%}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...