C# 如何处理在Blazor webassembly中更改数据的并发用户

C# 如何处理在Blazor webassembly中更改数据的并发用户,c#,blazor,C#,Blazor,我目前对Blazor webassembly的理解是,用户加载一个应用程序,对web API进行一次初始调用,并检索要显示的数据集。然后,用户可以在本地与数据交互,并且仅在用户插入、更新或删除项目时调用API。除了初始调用之外,不需要进一步的“Get”调用,因为数据的状态是本地加载的 如果期望多个并发用户与同一数据集交互,该怎么办?传统上,在标准web应用程序中,每当重新加载页面时,数据集的外部更改都会很快可见,并且从后端存储检索到新的数据集。在某些情况下,如果期望用户长时间坐在页面上而不重新加

我目前对Blazor webassembly的理解是,用户加载一个应用程序,对web API进行一次初始调用,并检索要显示的数据集。然后,用户可以在本地与数据交互,并且仅在用户插入、更新或删除项目时调用API。除了初始调用之外,不需要进一步的“Get”调用,因为数据的状态是本地加载的

如果期望多个并发用户与同一数据集交互,该怎么办?传统上,在标准web应用程序中,每当重新加载页面时,数据集的外部更改都会很快可见,并且从后端存储检索到新的数据集。在某些情况下,如果期望用户长时间坐在页面上而不重新加载,则可能需要引入轮询


我不确定Blazor世界中处理此类用例的最佳实践是什么。对web API的轮询是一种可接受的解决方案吗?我应该让SignalR通知客户数据集中的更改吗?有没有我忽略的内置机制?

我认为Blazor在这方面与其他框架没有什么不同。如果要在浏览器上编辑对象,则有两种选择:

  • 让每个用户编辑和保存,而不需要用户之间的任何协调。对象将保持上次用户保存它时的状态

  • 实现某种对象锁定。我不知道.NETCore是否提供了这种功能,但自己管理应该不难。因此在这个场景中,如果用户签出了一个对象,那么在返回签出之前,不允许其他用户编辑它。但我怀疑这种策略是否适用于通用应用程序。对于企业来说,这可能有效。问题是有人在返回对象之前关闭了浏览器。在您实现某种超时之前,其他用户将无法访问该对象。更新:efcore 具有并发检测,您可以将其配置为引发DbUpdateConcurrencyException。然后,您可以使用它来覆盖其他用户所做的更改,或者为用户提供重新加载新数据的选项等


  • 关于刷新数据的问题,一般的做法似乎是在初始化组件时获取数据,进行更改,然后将其保存回去。很少有人会想在这两者之间重新取得联系,尽管你可以随心所欲地经常这样做。但这也会一次又一次地刷新用户界面。

    经过一些研究,在Blazor Webassembly中实现这一点的唯一标准、公认的方法是使用