如何在套接字接收事件时更新Blazor(托管)

问题描述 投票:1回答:2

您好我有一个blazor页面,其中我想显示一个变量。这个变量从另一个线程(Task-通过websocket接收数据)更新,我想以线程安全的方式显示它:

Blazor Page

@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
multithreading websocket blazor
2个回答
1
投票

在通过websocket接收数据后调用StateHasChanged();没问题。一切都应该运行。我测试了它(作为服务器端)并且运行没有问题:

https://github.com/ctrl-alt-d/blazorTestingWebSocketsServerSide/tree/master

enter image description here

此外,我已将其作为客户端主题进行测试,它们有几个问题:

  1. 您正在使用非netstandard2.0类的ArrayPool
  2. WebSocket无法从wasm连接。

2
投票

你可能在StateHasChanged();方法结束时缺乏OnRunPressed

我猜这是服务器端的Blazor,对吧?

如果没有,那么你应该知道WASM上的Mono目前是单线程的......

© www.soinside.com 2019 - 2024. All rights reserved.