如何在套接字接收事件时更新 Blazor(托管)
How to update Blazor (hosted) upon socket receive event
你好,我有一个 blazor 页面,我想在其中显示一个变量。
这个变量从另一个线程(任务 - 通过 websocket 接收数据)更新,我想以线程安全的方式显示它:
Blazor 页面
@page "/new"
@inherits NewBase
<button onclick="@(async()=>await OnRunPressed())" class="control-button">Run</button>
NewValue :@socketString
public class NewBase:BlazorComponent
{
[Inject] protected BenchService service { get; set; }
protected CancellationTokenSource src = new CancellationTokenSource();
protected string socketString;
protected async Task OnRunPressed()
{
Task updateTask= Task.Run(async () =>
{
var buffer =new byte[1024];
ClientWebSocket socket = new ClientWebSocket();
await socket.ConnectAsync(new Uri("ws://localhost:8500/monitor"), CancellationToken.None);
while (true)
{
await socket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
this.socketString = Encoding.UTF8.GetString(buffer);
this.StateHasChanged();
}
},src.Token);
await this.service.HitServerAsync(); //does some stuff while the above task works
src.Cancel();
}
}
更新
感谢@Dani,现在我终于至少得到了一个错误:
blazor.server.js:16 POST http://localhost:8500/_blazor/negotiate 500 (Internal Server Error)
Error: Failed to start the connection: Error: Internal Server Error
你可能在OnRunPressed
方法的末尾缺少StateHasChanged();
我想这是服务器端的 Blazor,对吧?
如果不是,那么你应该知道 WASM 上的 Mono 目前是单线程的...
通过websocket接收数据后调用StateHasChanged();
没有问题。都应该运行。我已经对其进行了测试(作为服务器端)并且 运行 没有问题:
https://github.com/ctrl-alt-d/blazorTestingWebSocketsServerSide/tree/master
此外,我已经将它作为客户端 wasm 进行了测试,它们是几个问题:
- 您使用的
ArrayPool
是非 netstandard2.0 class。
- WebSocket 无法从 wasm 连接。
你好,我有一个 blazor 页面,我想在其中显示一个变量。 这个变量从另一个线程(任务 - 通过 websocket 接收数据)更新,我想以线程安全的方式显示它:
Blazor 页面
@page "/new"
@inherits NewBase
<button onclick="@(async()=>await OnRunPressed())" class="control-button">Run</button>
NewValue :@socketString
public class NewBase:BlazorComponent
{
[Inject] protected BenchService service { get; set; }
protected CancellationTokenSource src = new CancellationTokenSource();
protected string socketString;
protected async Task OnRunPressed()
{
Task updateTask= Task.Run(async () =>
{
var buffer =new byte[1024];
ClientWebSocket socket = new ClientWebSocket();
await socket.ConnectAsync(new Uri("ws://localhost:8500/monitor"), CancellationToken.None);
while (true)
{
await socket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
this.socketString = Encoding.UTF8.GetString(buffer);
this.StateHasChanged();
}
},src.Token);
await this.service.HitServerAsync(); //does some stuff while the above task works
src.Cancel();
}
}
更新 感谢@Dani,现在我终于至少得到了一个错误:
blazor.server.js:16 POST http://localhost:8500/_blazor/negotiate 500 (Internal Server Error)
Error: Failed to start the connection: Error: Internal Server Error
你可能在OnRunPressed
方法的末尾缺少StateHasChanged();
我想这是服务器端的 Blazor,对吧?
如果不是,那么你应该知道 WASM 上的 Mono 目前是单线程的...
通过websocket接收数据后调用StateHasChanged();
没有问题。都应该运行。我已经对其进行了测试(作为服务器端)并且 运行 没有问题:
https://github.com/ctrl-alt-d/blazorTestingWebSocketsServerSide/tree/master
此外,我已经将它作为客户端 wasm 进行了测试,它们是几个问题:
- 您使用的
ArrayPool
是非 netstandard2.0 class。 - WebSocket 无法从 wasm 连接。