如何使Blazor页面使用来自gRPC服务的传入数据更新一个html标记的内容

时间:2020-01-16 17:54:32

标签: grpc blazor

因此,我正在使用Blazor和gRPC进行测试,目前我的困难在于如何在类中传递变量的内容,特别是在收到新信息时将gRPC GreeterService类传递给Blazor页面。请注意,我的应用是一个客户端和一个服务器,并且我对该服务器进行了初始通信,然后服务器每次有新数据要发送时,就开始以一元模式向客户端发送数据(数字)。我已经完成了所有这些工作,但是现在我把它留给了最终的实现。

这是我的Blazor页面

@page "/greeter"
@inject GrpcService1.GreeterService GreeterService1


@using BlazorApp1.Data

<h1>Grpc Connection</h1>

<input type="text" @bind="@myID" />
<button @onclick="@SayHello">SayHello</button>


<p>@Greetmsg</p>
<p></p>

@code {
    string Name;
    string Greetmsg;


    async Task SayHello()
    {
        this.Greetmsg = await this.GreeterService1.SayHello(this.myID);

    }

}

如果接受了hello,则稍后从服务器接收通信的方法如下:

public override async Task<RequestResponse> GiveNumbers(BalconyFullUpdate request, ServerCallContext context)
        {
            RequestResponse resp = new RequestResponse { RequestAccepted = false };
            if (request.Token == publicAuthToken)
            {
                number = request.Number;
                resp = true;
            }
            return await Task.FromResult(resp);
}

每次有新号码到达时,我都希望在用户界面中显示它。

我可以做的另一种方式是,在一段时间内,我可以调用服务器以请求一个新号码,就像SayHello请求一样,只是等待服务器响应,只有当他有一个要发送的新号码。界面更新时。我只是不愿意这样做,因为恐怕由于某种原因,客户的请求被忘记了,而客户只是坐在那里等待永远不会到来的响应。我知道我可以在客户端实施超时来处理该问题,并且在服务器上我可以使用线程暂停之类的方法暂停响应,并且当生成新数字的方法具有新数字时,它可能会暂停对客户端的响应(不知道如何执行此操作)。在我看来,最后一个解决方案比第一个解决方案难得多。 您对此有何看法?和解决方案。

##################### UPDATE ######################### #

现在,我正在尝试使用单例,在Blazor页面中获取其实例,并订阅其内部事件。

这是单例: 公共类ThreadSafeSingletonString { 私有静态ThreadSafeSingletonString _instance; 私有静态只读对象_padlock = new object(); 私有ThreadSafeSingletonString() {

        }

        public static ThreadSafeSingletonString Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock(_padlock)
                    {
                        if (_instance == null)
                        {
                            _instance = new ThreadSafeSingletonString();
                            _instance.number="";
                        }
                    }
                    
                }
                return _instance;
            }
            set
            {
                _instance.number= value.number;
                _instance.NotifyDataChanged();
            }
        }
        public int number{ get; set; }

        public event Action OnChange;

        private void NotifyDataChanged() => OnChange?.Invoke();

在代码部分的Blazor页面中,我有:

protected override void OnInitialized()
    {
        threadSafeSingleton.OnChange += updateNumber();
    }

    public System.Action updateNumber()
    {
        this.fromrefresh = threadSafeSingleton.number + " que vem.";
        Console.WriteLine("Passou pelo UpdateNumber");
        this.StateHasChanged();
        return StateHasChanged;
    }

不幸的是,updatenumber函数永远不会执行...

0 个答案:

没有答案