2017-06-06 13 views
1

私は、サーバーとのWebSocket HTTPListenerを持っている、そしてクライアントがWebSocketのあるドゥのWebSocket SendAsync()同期

私は、リスト内のすべての現在のクライアントを維持し、私はに情報を送る機能を持つようにしたいですすべてのクライアントを非同期に

は、だから私は、現在持っているものです。

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()関数が同期的に発生する可能性があると考えましたが、WebSocketには同期関数がありません。これは私には奇妙です。

私は、タスク関数を同期して実行するのは良い習慣ではないと思うので、それを行う良い方法はありますか?私はちょうどawaitを落としたくありません。

答えて

0

問題は、多数のクライアントがある場合は、意味のあるスレッド数を開いていることです。これは私にとっては無駄です。

つの質問:

  1. あなたがスレッドを測定したことがありますか? 「意味のある数字」はどれくらいですか?
  2. パフォーマンステストでは、これらのスレッドが「無駄」であることが示されていますか?

ネットワークソケットdoesn't consume a threadに書き込んだので、コードは既にスレッドプールを適切に使用しています。私はスレッドの数がこのコードで大幅に増加するとは思わないでしょう。 の追加スレッドがいくつか作成されている場合は、これらの追加スレッドが役に立ちますです。このようなI/Oバウンド操作では、よりうまくいくことは難しいです。無関係なサイドノートで

、私はむしろ、一度に1よりも、同時にすべてのクライアントへの送信をお勧めします:

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

テストの後、私の質問は、オーバー最適化不要ですについて確かです。時にはそれをもう一度聞くことは良いことです。ありがとうございました! – galah92

関連する問題