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

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

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

【问题讨论】:

    标签: c# multithreading asp.net-core blazor mutex


    【解决方案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 知道何时解除锁定。

    【讨论】:

      猜你喜欢
      • 2018-05-23
      • 1970-01-01
      • 2012-09-04
      • 2018-03-27
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多