示例#1
0
        private static void Main()
        {
            XmlConfigurator.Configure();
            try
            {
                var coresAmount = Environment.ProcessorCount;
                ThreadPool.SetMinThreads(128 * coresAmount, 128 * coresAmount);
                var server   = PrepareHttpServer();
                var wsServer = PrepareWsServer();

                Database.HologramsField.Init(
                    Settings.HologramsPath,
                    (holo, s) =>
                    wsServer.BroadcastAsync(HologramJsonSchema.FromHolo(holo), s, CancellationToken.None));

                Task.WhenAll(
                    server.AcceptLoopAsync(CancellationToken.None),
                    wsServer.AcceptLoopAsync(CancellationToken.None)
                    ).Wait();
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex);
                Log.Fatal("Unexpected exception", ex);
                Environment.Exit(ex.HResult == 0 ? ex.HResult : -1);
            }
        }
 private async Task TrySendAsync(WebSocket ws, Connection connection, HologramJsonSchema hologram, CancellationToken token, string msg = null)
 {
     try
     {
         if (!connection.NeedSend(hologram))
         {
             return;
         }
         msg = msg ?? hologram.ToJsonString();
         using (await connection.Lock.AcquireAsync(token).ConfigureAwait(false))
             await ws.WriteStringAsync(msg, token).ConfigureAwait(false);
     }
     catch
     {
         Remove(ws);
     }
 }
 public Task BroadcastAsync(HologramJsonSchema holo, string msg, CancellationToken token)
 {
     if (msg == null)
     {
         msg = holo.ToJsonString();
     }
     return
         (Task.WhenAll(
              sockets
              .Where(pair =>
     {
         var ws = pair.Key;
         if (ws.IsConnected)
         {
             return true;
         }
         Remove(ws);
         return false;
     })
              .Select(pair => TrySendAsync(pair.Key, pair.Value, holo, token, msg))));
 }