gpt4 book ai didi

c# - 同步执行 WebSocket SendAsync()

转载 作者:太空宇宙 更新时间:2023-11-03 15:04:25 34 4
gpt4 key购买 nike

我有一个 Websocket HTTPListener 作为服务器,客户端是 WebSocket

我将所有当前客户端保存在一个列表中,我想要一个向所有客户端异步发送信息的函数。

所以我目前拥有的是:

private async Task SendToAll(byte[] buffer)
{
foreach (WebSocket webSocket in clients)
{
await Send(webSocket, buffer, buffer.Length);
}
}

private async Task Send(WebSocket webSocket, byte[] buffer, int bufferLength)
{
try
{
await webSocket.SendAsync(
new ArraySegment<byte>(buffer, 0, bufferLength),
WebSocketMessageType.Text, true,
CancellationToken.None);
}
catch (WebSocketException ex)
{
RemoveClient(webSocket, WebSocketCloseStatus.InternalServerError, ex.Message);
}
}

问题是,如果有大量客户,我会打开大量线程,这对我来说是一种浪费。所以我认为 Send() 函数可以同步发生,但是 WebSockets 没有同步函数,这对我来说很奇怪。

我认为同步运行 Task 函数不是一个好习惯,有什么好的方法吗?我不想只是放弃 await

最佳答案

Problem is, if a have a big number of clients I'm opening a meaningful number of threads, which is a waste to me.

两个问题:

  1. 你量过线了吗? “有意义的数字”到底是多少?
  2. 性能测试是否表明这些线程是“浪费”?

自写入网络套接字doesn't consume a thread ,代码已经适本地使用了线程池。我不希望线程数在此代码中显着增加。如果有 正在创建一些额外的线程,那是因为这些额外的线程很有用。对于此类 I/O 密集型操作,很难做得更好。

在一个不相关的旁注中,我建议同时发送给所有客户端,而不是一次一个:

private async Task SendToAll(byte[] buffer)
{
var tasks = clients.Select(webSocket => Send(webSocket, buffer, buffer.Length));
await Task.WhenAll(tasks);
}

关于c# - 同步执行 WebSocket SendAsync(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44389657/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com