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)))); }