首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步执行WebSocket SendAsync()

同步执行WebSocket SendAsync()
EN

Stack Overflow用户
提问于 2017-06-06 12:10:25
回答 1查看 2.2K关注 0票数 2

我有一个Websocket HTTPListener作为服务器,客户端是WebSocket(https://msdn.microsoft.com/en-us/library/system.net.websockets.websocket(v=vs.110%29.aspx)'s )

我将所有当前客户端保存在一个列表中,并且希望有一个函数异步地向所有客户端发送信息。

所以我现在拥有的是:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-06 12:37:28

问题是,如果有大量的客户端,我会打开大量的线程,这对我来说是一种浪费。

两个问题:

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

由于写入网络套接字不会消耗线程,代码已经在适当地使用线程池。我不会期望在这段代码中线程数量会显著增加。如果有少数额外的线程正在创建,那么这是因为这些额外的线程是有用的。这样的I/O操作很难做得更好。

另外,我建议同时向所有客户发送,而不是一次发送一个:

代码语言:javascript
复制
private async Task SendToAll(byte[] buffer)
{
  var tasks = clients.Select(webSocket => Send(webSocket, buffer, buffer.Length));
  await Task.WhenAll(tasks);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44389657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档