Как обновить Blazor (размещено) при получении события сокета - PullRequest
0 голосов
/ 17 февраля 2019

Здравствуйте, у меня есть страница, в которой я хочу отобразить переменную.Эта переменная обновляется из другого потока (Task-, который получает данные через веб-сокет), и я хочу отображать ее в поточно-ориентированном виде:

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

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Нет проблем с вызовом StateHasChanged(); после получения данных через websocket.Все должно бежать.Я проверил его (на стороне сервера), и он работает без проблем:

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

enter image description here

Кроме того, я проверилэто как на стороне клиента wasm, так как есть несколько проблем:

  1. Вы используете ArrayPool, который не является классом netstandard2.0.
  2. WebSocket не может подключиться из wasm.
0 голосов
/ 17 февраля 2019

Возможно, вам не хватает StateHasChanged(); в конце OnRunPressed метода

Полагаю, это Blazor на стороне сервера, верно?

Если нет, то вы должны знать, что Mono на WASM в настоящее время является однопоточным ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...