我正在学习 Blazor。我遇到了一个问题 - 你需要有一个不断运行的 websocket 客户端,当收到消息时,它将将它们广播到网页,并根据页面中的命令将某些内容发送到服务器。
找到的所有示例都归结为这样一个事实:他们创建了一个客户端,连接到回显服务器,发送消息,读取响应并完成工作。
我做了什么:我用这个任务创建了一个连接到服务器并循环等待消息的任务。读取后,只是将其输出到日志中。我做了一个发送消息的函数。看起来还不错。
我将其发布在 Program.cs 中,它连接、监听,一切似乎都很好,但我无法从 *.razor 调用发送函数 - CS8801
我将所有内容转移到 .razoz,基于页面中的事件,调用 runWS(之后要调用 sendWS) - websocket 客户端连接,但随后,从逻辑上讲,它等待来自服务器的消息,但有没有消息——我们挂着,我们等待。
@code{
private static ClientWebSocket ws;
private static async Task DoClientWebSocket()
{
using ( ws = new ClientWebSocket())
{
Uri serverUri = new Uri("wss://echo.websocket.org/");
await ws.ConnectAsync(serverUri, CancellationToken.None);
while (ws.State == WebSocketState.Open )
{
//Receive buffer
var receiveBuffer = new byte[2048];
//Multipacket response
var offset = 0;
var dataPerPacket = 1024; //Just for example
while (true)
{
ArraySegment<byte> bytesReceived =
new ArraySegment<byte>(receiveBuffer, offset, dataPerPacket);
WebSocketReceiveResult result = await ws.ReceiveAsync(bytesReceived,
source.Token);
offset += result.Count;
if (result.EndOfMessage)
break;
}
Console.WriteLine("\nWS message: {0}",
Encoding.UTF8.GetString(receiveBuffer, 0,
offset));
}
}
}
public async Task runWS()
{
var taskWebConnect = Task.Run(() => DoClientWebSocket());
taskWebConnect.Wait();
}
public async Task sendWS(string text)
{
ArraySegment<byte> arraySegment = new ArraySegment<byte>(Encoding.UTF8.GetBytes( text ));
await ws.SendAsync(arraySegment, System.Net.WebSockets.WebSocketMessageType.Text, true, CancellationToken.None);
}
}
告诉我如何并行运行任务?通过网页中的事件,或者在应用程序启动时立即执行。