如何制作 Blazor 页面互斥锁

Posted

技术标签:

【中文标题】如何制作 Blazor 页面互斥锁【英文标题】:How to make a Blazor page mutex 【发布时间】:2021-12-07 16:31:58 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于如何制作 Blazor 页面互斥锁的主要内容,如果未能解决你的问题,请参考以下文章

锁定未锁定的互斥体的效率如何?互斥锁的成本是多少?

共享锁排他锁互斥锁悲观锁乐观锁行锁表锁页面锁不可重复读丢失修改读脏数据

理解概念:共享锁排他锁互斥锁悲观锁乐观锁行锁表锁页面锁不可重复读丢失修改读脏数据

如何理解互斥锁条件锁读写锁以及自旋锁?

为啥互斥锁不需要互斥锁(而互斥锁需要互斥锁......)

在互斥锁中,处理器(CPU)如何知道要解锁哪个进程?