Blazor Server:如何可靠地处理用户操作的延迟?

Blazor Server: How to reliably handle the delay of user actions?

比较 Blazor Server 和 Blazor WebAssembly,我发现一个显着的区别是 might/should 对应用程序设计有很大的影响。让我根据一个简单的要求来概述这种差异:

Clicking a button to increase a counter and whenever the counter reaches 10, the button will be disabled.

我们比较一下:


作为使用 Blazor Server 的程序员,我不能再依赖我可能在 JavaScript 应用程序中习惯的用户交互事件的同步不间断处理。 我必须用额外的健全性检查来打乱我所有的事件处理程序,以确保没有意外发生。这也阻止了从 Blazor WebAssembly 到 Blazor Server 的直接迁移(坦率地说,反之亦然) .

请注意,我不相信延迟太小以至于在 GUI 更新之前没有真正的用户能够再次单击的论点。即使对于非常受控的网络条件,延迟也可能会意外发生。此外,依靠机会和外部因素从来都不是一个好的选择。还记得墨菲定律吗?

我的问题是:你在实践中是如何处理这个问题的?您是否费心在事件处理程序中编写所有这些完整性检查?

我会通过 javascript 禁用所有点击按钮并在保存后启用它们

我得出结论,为了在源代码级别平等对待 Blazor WebAssembly 和 Blazor Server,您必须为自己应用某些模式和限制,否则运行时行为可能会有所不同。

其中之一是 Blazor 服务器中发生的输入延迟。即使它是 - 或者 应该 是 - 小,如果你希望在从 WebAssembly 切换到服务器时防止讨厌的错误,你仍然必须解决它。

解决它的一种方法是使用代码保护每个事件处理程序(对用户交互事件做出反应),确保前端的状态确实可以安全地执行此处理程序。在“传统的”SPA Web 应用程序(如 Angular)中,无论如何都应该防止在服务器端进行不需要的操作,在 Blazor 应用程序中也是如此。但是,在 Blazor 应用程序中,您 还必须更加严密地保护您的前端,因为您不能依赖不间断的同步处理程序执行。

在我看来,Blazor 是一个漏洞抽象,因为 WebAssembly 和服务器之间的决定不仅仅是一个实现细节。