Warm tip: This article is reproduced from serverfault.com, please click

c#-如何制作 Blazor 页面互斥锁

(c# - How to make a Blazor page mutex)

发布于 2021-10-20 21:02:02

我想让它让我的 Blazor 应用程序的一页只能同时运行一次。这意味着当任何用户启动它的功能(它在我们的数据库上工作)时,另一个用户将无法首先完成所有工作。

有点像锁定/使用互斥锁。

Questioner
Tessaract
Viewed
0
Bennyboy1973 2021-10-21 07:08:48

对于共享状态信息,在 Blazor 中添加具有依赖注入的单例是很正常的。 警告这不是经过测试的代码,但你可以理解。

创建一个单例类:

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为 null 否则它将被永久锁定。 如果他们忘记并关闭浏览器。. . 那会很糟糕。你必须想出一个可靠的方法来保证锁被移除。你可以添加计时器来检查电路是否仍然打开,并且可能应该有一个事件,以便PageToLock.razor知道何时解除锁定。