因此,我正在使用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函数永远不会执行...