我有一个Websocket HTTPListener作为服务器,客户端是WebSocket(https://msdn.microsoft.com/en-us/library/system.net.websockets.websocket(v=vs.110%29.aspx)'s )
我将所有当前客户端保存在一个列表中,并且希望有一个函数异步地向所有客户端发送信息。
所以我现在拥有的是:
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。
发布于 2017-06-06 12:37:28
问题是,如果有大量的客户端,我会打开大量的线程,这对我来说是一种浪费。
两个问题:
由于写入网络套接字不会消耗线程,代码已经在适当地使用线程池。我不会期望在这段代码中线程数量会显著增加。如果有少数额外的线程正在创建,那么这是因为这些额外的线程是有用的。这样的I/O操作很难做得更好。
另外,我建议同时向所有客户发送,而不是一次发送一个:
private async Task SendToAll(byte[] buffer)
{
var tasks = clients.Select(webSocket => Send(webSocket, buffer, buffer.Length));
await Task.WhenAll(tasks);
}https://stackoverflow.com/questions/44389657
复制相似问题