首页 > 解决方案 > 长后端请求的 MVVM 进度条

问题描述

我有一个带有数据表和大量记录的 WPF/MVVM 应用程序。用户可以选择尽可能多的记录来更新所有记录的一个或多个属性。如果用户单击更新按钮,我的后端将处理更改并更新数据库中的所有记录。但是,每个更改都需要发送到其他一些系统。更新查询本身不需要很长时间,对其他系统的更改需要更多时间。

所以假设用户选择了 2000 行来更新。用户大部分时间都没有耐心,即使只有 3 秒也不喜欢等待。我所做的是以下内容:

if(totalSelectedRows > 1000) { SplitUpdateRequest(); }
else { Update(selectedRows); }

我基本上说如果选择的行数超过 1000 行,更新命令将拆分为多个更新命令,每个更新命令 100 行。所以对于 2000 行,我同步调用 update 方法 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}%}"/>

标签: c#wpfmvvm

解决方案


推荐阅读