我有一个带有数据表和大量记录的WPF / MVVM应用程序。用户可以根据需要选择尽可能多的记录 更新所有记录的一个或多个属性。如果用户单击更新按钮,我的后端将处理更改并更新 数据库中的所有记录。但是,每个更改都需要发送到其他一些系统。更新查询本身不会花费很长时间, 对其他系统的更改需要更多时间。
因此,假设用户选择了2000行进行更新。用户大部分时间都不熟练,甚至只等待3秒钟也不愿意等待。 我所做的是以下事情:
if(totalSelectedRows > 1000) { SplitUpdateRequest(); }
else { Update(selectedRows); }
我基本上是说,如果选择的行数超过1000,则update命令将分成多个更新命令,每行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}%}"/>