C# 数据虚拟化和用户并发

C# 数据虚拟化和用户并发,c#,wpf,architecture,datagrid,data-virtualization,C#,Wpf,Architecture,Datagrid,Data Virtualization,在使用数据虚拟化时,是否有人就如何解决多用户场景中可能出现的许多问题提供了一些建议/示例。假设我们正在讨论WPF和DataGrid。实现按需加载的虚拟化集合并不太困难。但是,如果没有存储原始查询临时结果的暂存区域,我们会遇到如下并发问题: 加载新页面可能会获取不正确的数据(并发用户添加和删除一些记录,导致记录总数相同,但这会导致页面获取已在网格上方某处显示的重复条目) 在滚动和加载新页面时保留网格中的用户选择,在这种情况下,一旦选定的项目从缓存中过期,并且一旦重新加载,我们就会发现有人删除了它们

在使用数据虚拟化时,是否有人就如何解决多用户场景中可能出现的许多问题提供了一些建议/示例。假设我们正在讨论WPF和DataGrid。实现按需加载的虚拟化集合并不太困难。但是,如果没有存储原始查询临时结果的暂存区域,我们会遇到如下并发问题:

  • 加载新页面可能会获取不正确的数据(并发用户添加和删除一些记录,导致记录总数相同,但这会导致页面获取已在网格上方某处显示的重复条目)
  • 在滚动和加载新页面时保留网格中的用户选择,在这种情况下,一旦选定的项目从缓存中过期,并且一旦重新加载,我们就会发现有人删除了它们。我们可以取消所有的选择,并将消息显示给用户,但是/同时,如果用Shift点击(MuldoScice)选择接近列表末尾的某个地方,那么当加载一些中间页面(同时添加用户项)时,当列表中的一些项“出现”时应该做些什么。李>
    请记住,用户屏幕上的任何内容在技术上都不是最新的。当您显示它时,您在主数据集上就落后了

    1) 当然可以。但是,您可以随时跟踪网格上显示的第一条记录,并从中获得下一页大小的设置。当然,那些被删除的内容将从视图中消失。或者,您可以尝试使用诸如ZeroMQ或RabbitMQ之类的库和广播数据集更改,并在当前显示的情况下实时更新datagrid。显然,它仍然不会完全同步,但您将减少它们不同步的窗口

    2) 选择项目后,可以跟踪其主键。我不知道你想对那些已经从主数据集中删除的数据做什么。但你总是可以对其他人采取行动,对吗?即使它们不再显示,您也可以跟踪PK。并在加载页面时重新选择它们