如何制作 Blazor 页面互斥体
How to make a Blazor page mutex
我想让我的 Blazor 应用程序的一页只能同时运行一次。这意味着当任何用户启动其功能(它正在我们的数据库上工作)时,另一个用户将无法启动,直到所有工作首先完成。
有点像锁定/使用互斥锁。
对于共享状态信息,在 Blazor 中添加具有依赖注入的单例是正常的。
警告这不是经过测试的代码,但您可以理解。
创建单例class:
public class LockState {
public string UserId { get; set; }
}
在Startup.cs
中注册
public void ConfigureServices(IServiceCollection services){
// . . .
services.AddSingleton<LockState>();
}
注入PageToLock.razor
@inject LockState LS
@inject AuthenticationStateProvider ASP
@if(LS.UserId == this.Userid){
<YourDataBaseControl />
<button @onclick="()=> this.UserId = null">X</button>
}
else {
<div>The Database Control is Currently being used. . . </div>
}
@code {
string UserId;
protected override async Task OnInitializedAsync(){
UserId = (await ASP.GetAuthenticationStateAsync()).User.FindFirst(c => c.Type.Contains("nameidentifier"))?.Value;
if (LS.UserId is null) LS.UserId = this.UserId;
}
}
注意有问题。当用户完成页面时,他们必须将 LS.UserId
设置为空,否则它将永远锁定。 如果他们忘记并关闭浏览器。 . .那会很糟糕。你必须想出一个可靠的方法来保证锁被移除。您可以添加计时器来检查电路是否仍处于打开状态,并且可能应该有一个事件,以便 PageToLock.razor
知道锁何时被移除。
我想让我的 Blazor 应用程序的一页只能同时运行一次。这意味着当任何用户启动其功能(它正在我们的数据库上工作)时,另一个用户将无法启动,直到所有工作首先完成。
有点像锁定/使用互斥锁。
对于共享状态信息,在 Blazor 中添加具有依赖注入的单例是正常的。 警告这不是经过测试的代码,但您可以理解。
创建单例class:
public class LockState {
public string UserId { get; set; }
}
在Startup.cs
中注册public void ConfigureServices(IServiceCollection services){
// . . .
services.AddSingleton<LockState>();
}
注入PageToLock.razor
@inject LockState LS
@inject AuthenticationStateProvider ASP
@if(LS.UserId == this.Userid){
<YourDataBaseControl />
<button @onclick="()=> this.UserId = null">X</button>
}
else {
<div>The Database Control is Currently being used. . . </div>
}
@code {
string UserId;
protected override async Task OnInitializedAsync(){
UserId = (await ASP.GetAuthenticationStateAsync()).User.FindFirst(c => c.Type.Contains("nameidentifier"))?.Value;
if (LS.UserId is null) LS.UserId = this.UserId;
}
}
注意有问题。当用户完成页面时,他们必须将 LS.UserId
设置为空,否则它将永远锁定。 如果他们忘记并关闭浏览器。 . .那会很糟糕。你必须想出一个可靠的方法来保证锁被移除。您可以添加计时器来检查电路是否仍处于打开状态,并且可能应该有一个事件,以便 PageToLock.razor
知道锁何时被移除。