Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否同步执行WebSocket SendAsync()_C#_Multithreading_Asynchronous_Websocket - Fatal编程技术网

C# 是否同步执行WebSocket SendAsync()

C# 是否同步执行WebSocket SendAsync(),c#,multithreading,asynchronous,websocket,C#,Multithreading,Asynchronous,Websocket,我有一个WebsocketHTTPListener作为服务器,客户端是的 我将所有当前客户机都保存在一个列表中,我希望有一个函数可以异步地向所有客户机发送信息 因此,我目前拥有的是: private async Task SendToAll(byte[] buffer) { foreach (WebSocket webSocket in clients) { await Send(webSocket, buffer, buffer.Length); } }

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

我将所有当前客户机都保存在一个列表中,我希望有一个函数可以异步地向所有客户机发送信息

因此,我目前拥有的是:

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);
    }
}
private async Task SendToAll(字节[]缓冲区)
{
foreach(客户端中的WebSocket WebSocket)
{
等待发送(webSocket、buffer、buffer.Length);
}
}
专用异步任务发送(WebSocket WebSocket,字节[]缓冲区,int bufferLength)
{
尝试
{
等待webSocket.SendAsync(
新的ArraySegment(buffer,0,bufferLength),
WebSocketMessageType.Text,true,
取消令牌(无);
}
捕获(WebSocketException例外)
{
RemoveClient(webSocket、WebSocketCloseStatus.InternalServerError、ex.Message);
}
}
问题是,如果一个服务器有大量的客户端,我打开的线程数量就相当多,这对我来说是一种浪费。所以我认为
Send()
函数可以同步发生,但是
WebSocket
s没有同步函数,这对我来说很奇怪

我认为同步运行任务函数不是一个好的实践,有没有好的方法?我不想只放下
等待

问题是,如果一个服务器有大量的客户端,我打开的线程数量就相当多,这对我来说是一种浪费

两个问题:

  • 你量过线了吗?“有意义的数字”到底是多少
  • 性能测试是否表明这些线程是一种“浪费”
  • 由于写入网络套接字,代码已经适当地使用了线程池。我不希望在这段代码中线程的数量显著增加。如果有少数额外的线程被创建,那是因为这些额外的线程是有用的。对于这样的I/O绑定操作,很难做得更好

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

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

    经过测试,我的问题肯定是过度优化,这是不必要的。有时候再次听到它是件好事。非常感谢。